小编典典

为什么 C# 构造函数不能推断类型?

all

为什么构造函数不支持泛型方法的类型推断?

public class MyType<T>
{
   private readonly T field;
   public MyType(T value) { field = value; }
}

var obj = new MyType(42); // why can't type inference work out that I want a MyType<int>?

虽然你可以通过工厂课程来解决这个问题,

public class MyTypeFactory
{
   public static MyType<T> Create<T>(T value)
   {
      return new MyType<T>(value);
   }
}
var myObj = MyTypeFactory.Create(42);

构造函数不能支持类型推断是否有实际或哲学原因?


阅读 93

收藏
2022-08-08

共1个答案

小编典典

构造函数不能支持类型推断有哲学上的原因吗?

不,当你有

new Foo(bar)

然后我们可以在范围内识别所有称为 Foo
的类型,而不管泛型数量如何,然后使用修改后的方法类型推断算法对每个类型进行重载解析。然后,我们必须创建一个“更好”算法,以确定
具有相同名称但具有不同泛型的两种类型中 的两个适用构造函数中的哪一个是更好的构造函数。为了保持向后兼容性,非泛型类型的 ctor 必须始终获胜。

构造函数不能支持类型推断有实际原因吗?

是的。即使该功能的好处超过了它的成本——这是相当可观的——这还不足以实现一个功能。与我们可以投资的所有其他可能的功能相比,该功能不仅必须是净赢,而且必须是
巨大 的净赢。它还必须比将时间和精力花在错误修复、性能上更好工作,以及我们可以投入的其他可能领域。理想情况下,它必须很好地适应发行版的“主题”。

此外,正如您正确指出的那样,您可以通过使用工厂模式获得此功能的好处,而无需实际拥有该功能本身。简单的变通方法的存在降低了实现某个功能的可能性。

很长一段时间以来,此功能一直在可能的功能列表中。它在列表中的位置从来没有足够高以至于无法实际实施。

2015 年 3 月更新

提议的功能使其足够接近 C# 6 的列表顶部,以便指定和设计,但随后被删除。

2022-08-08