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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

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

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,性能更好工作和其他可能的领域,我们可以付出努力。理想情况下,它必须适合任何“主题”发布的内容。

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

用户回答回答于
public class MyType<T> 
{ 
   private readonly T field; 
   public MyType(T value) { field = value; } 
} 

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

还您的工厂是不正确,你需要有public class MyTypeFactory<T>不只是public class MyTypeFactory-除非你声明里面的工厂MyType

假设你有以下几点

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

扫码关注云+社区