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

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

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);

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


是否有构造函数不支持类型推断的哲学原因?

不,当你有

new Foo(bar)

那么我们可以在范围内标识所有名为Foo的类型,而不考虑泛型,然后使用修改的方法类型推理算法对每个类型进行重载解析。 然后,我们必须创建一个'更好的'算法来确定两种类型中具有相同名称但不同通用元素的两种适用构造函数中的哪一个是更好的构造函数。 为了保持向后兼容性,非泛型类型的ctor必须总是获胜。

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

是。 即使该功能的好处超过其成本 - 这相当可观 - 这还不足以实现功能。 不仅功能必须是净赢,它必须是一个大的净赢相比,我们只能在被投资的其他可能的特征,也有可能比花费是时间和精力上的bug修复,性能更好工作和其他可能的领域,我们可以付出努力。 理想情况下,它必须适合任何“主题”发布的内容。

此外,正如您正确指出的那样,通过使用工厂模式,您可以获得此功能的优势,而无需真正拥有该功能本身。 简单的解决方法的存在使得功能不太可能实现。

现在这个功能已经在可能的功能列表上很长一段时间了。 它从来没有接近清单上的任何地方,实际得到实施。

2015年3月更新

所提议的功能使其足够接近C#6列表的顶部,并被指定和设计,但之后被切断。


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

他们可以,没有必要再告诉构造函数“T是什么”,就像你已经在课堂上进行删减一样。

你的工厂也是不正确的,你需要public class MyTypeFactory<T>不只是public class MyTypeFactory - 除非你在MyType类中声明工厂

编辑更新:

那么,42是一个长,一个短,一个int,还是其他的东西?

假设你有以下几点

class Base
{
   public virtual void DoStuff() { Console.WriteLine("Base"); }
}

class Foo : Base
{
   public override void DoStuff() { Console.WriteLine("Foo");  }
}

然后你做到了

var c = new Foo();

var myType = new MyType(c);

你会期望foo被使用,还是base ? 我们需要告诉编译器使用什么来代替T

当你真的想要在类型base

因此,

var myType = new MyType<Base>(c);

泛型类型推断不能在你想要的构造函数上工作的主要原因是因为当你声明的所有类型都是“MyType <T>”时,类“MyType”不存在。 请记住以下两点是合法的:

public class MyType<T> {
}

public class MyType {
}

两者都是合法的。 如果你确实声明了两者,那么你如何消除语法歧义,并且他们都声明了一个冲突的构造函数。

链接地址: http://www.djcxy.com/p/66203.html

上一篇: Why can't the C# constructor infer type?

下一篇: Type inference on method return type