问题 C#构造函数通用参数推理[重复]


这个问题在这里已有答案:


4079
2018-03-25 09:51


起源



答案:


其他答案都错了。这没有技术上的原因。可以从构造函数调用推断出类型,因为它可以来自“普通”方法调用。

请参考Eric Lippert(前C#编译器开发人员)的回答: 为什么C#构造函数不能推断类型?


9
2018-03-25 10:23



对,你好,很好看。 - Gleno


答案:


其他答案都错了。这没有技术上的原因。可以从构造函数调用推断出类型,因为它可以来自“普通”方法调用。

请参考Eric Lippert(前C#编译器开发人员)的回答: 为什么C#构造函数不能推断类型?


9
2018-03-25 10:23



对,你好,很好看。 - Gleno


考虑以下:

public class Foo<T>
{
    public Foo(T value) { }
}

public class Foo
{
    public Foo(int value) { }
}

// suppose type parameter inference in constructor calls
var x = new Foo(5); // which one?

因为您可以声明两个具有相同名称的类型,一个泛型和一个非泛型,您需要在构造函数调用中明确地决定它们。强制类型参数是显式的是消除任何可能的歧义的一种方法。该语言可能有一些解决方案规则,但此功能的好处足以花费预算来实现它。


5
2018-03-25 09:55



好例子。但是,如果我们有两个方法重载怎么办:泛型而非泛型?我不认为这里有很大的不同 - SiberianGuy
如果它们是方法,则会被调用的相同 - 非泛型。 - Jon
乔恩是对的。从这个角度来看,构造函数调用只不过是任何其他方法调用,并且可以应用相同的推断规则。 - Florian Greinacher
虽然确实存在这种令人困惑的案例,但作为答案,这是不正确的 - 请参阅弗洛里安的答案。 (评论添加,因为这是目前最受欢迎的答案)。 - Eamon Nerbonne