【问题标题】:c# method type inference troubles [duplicate]c#方法类型推断麻烦[重复]
【发布时间】:2019-04-27 22:42:04
【问题描述】:

我无法让 c# 方法类型推断为我工作,我本质上有以下示例,但这会产生错误。

CS0411 无法从用法中推断方法“Test.Connect(T1)”的类型参数。尝试明确指定类型参数。

public void Main()
{
    new Test<int>().Connect(new Test2()); // CS0411 The type arguments for method 'Test<int>.Connect<T1, T2>(T1)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
}

public class Test2 : ITest<Test<int>, Delegate>
{

}

public class Test<T>
{
    public void Connect<T1, T2>(T1 entity)
        where T1 : ITest<Test<int>, T2>
        where T2 : Delegate
    {
    }
}

public interface ITest<T1, T2>
    where T1 : Test<int>
    where T2 : Delegate
{
}

编译器应该能够从给定的类中推断出参数 T1 和 T2 吗?我猜应该是,我错过了什么吗?

【问题讨论】:

  • 只有当我实际尝试在方法中使用新关键字时,新约束才有意义,新约束仅意味着指定的类型必须具有默认构造函数,但感谢您的评论
  • new Test().Connect(new Test2());
  • 我试图让编译器找出 Connect 部分,就像使用 void Connect(T value) where T : class 这样的方法定义时{ } 有了这样的定义,您可以使用这样的方法调用 Connect(new Test()) 省略类型定义,因为编译器可以弄清楚
  • 但是 Connect 签名的参数类型比泛型类型参数少 (2)

标签: c# .net types inference


【解决方案1】:

编译器应该能够从给定的类中推断出参数 T1 和 T2 吗?

没有。

我猜应该是的,我错过了什么吗?

您的猜测是合理的、常见的,但不正确。

类型参数永远不会从约束中推断出来,只能从参数中推断出来。您有足够的信息来推断 T1 的类型,但编译器不会从约束中推断出 T2 必须是什么。

编译器理论上可以从约束中进行推断,但我们决定仅从参数中推断。类型推断算法复杂,难以解释,难以实现;添加约束推断会使它更复杂、更难解释和更难实现。

【讨论】:

  • 所以除了字面传递类型之外,编译器无法为我推断 T2?
  • @Ronald:没错。如果类型参数出现在无形参类型中,则类型推断无法成功。
  • 感谢您的见解,希望使基类更易于使用,但我认为重新设计实现是要走的路。
  • @Ronald:通常在这些情况下,明智的做法是public void Connect&lt;T&gt;(ITest&lt;Test&lt;int&gt;, T&gt; entity) 但是,Delegate 的约束是可疑的。你能说你想做什么吗?这听起来像是一个“XY”问题;你对如何解决真正的问题有一个错误的想法,并且正在询问错误的想法。就您遇到的真正问题提出问题。
  • 你说得对,代表只是第一个作为示例想到的类,我在这里创建了一个示例,我的问题在第 122 行 gist.github.com/rvhelden/c56212da1a25af0abd671ad9e140ea0f 这里我希望能够只传递一个继承的Entity类而不传递所有类型参数
猜你喜欢
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2016-02-02
  • 2011-06-23
  • 2017-01-11
  • 1970-01-01
相关资源
最近更新 更多