为什么C#构造函数不能推断types?
为什么types推断不像构造函数那样支持generics方法?
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);
有构造函数不能支持types推断的实际或哲学的理由吗?
有一个哲学的原因,为什么构造不能支持types推断?
不,当你有
new Foo(bar)
那么我们可以在范围内识别所有types的Foo,而不考虑generics,然后使用修改的方法types推断algorithm对每个types进行重载parsing。 然后,我们必须创build一个“更好的”algorithm来确定两个types中具有相同名称但不同通用元素的两个可用构造函数中的哪一个是更好的构造函数。 为了保持向后兼容性,非genericstypes的ctor必须总是获胜。
有一个实际的原因,为什么构造函数不能支持types推断?
是。 即使function的好处超过其成本 – 这是相当可观的 – 这不足以实现function。 这个function不仅要成为一个净赢,相对于我们可能投资的所有其他可能的function,它必须是一个巨大的净胜利。它还必须比花费那些时间和精力来修复bug,性能工作,以及其他可能的领域,我们可以把这个努力。 理想情况下,无论发布“主题”是什么,都要适合。
此外,正如您正确地指出的那样,通过使用工厂模式,您可以获得此function的优势,而无需实际拥有该function本身。 简单的解决方法的存在使得function不太可能实现。
这个function已经在很长一段时间的可能的function列表。 在名单上从来没有接近过高的地步,实际上得到实施。
更新2015年3月
build议的function使其足够接近C#6列表的顶部,并被指定和devise,但被切断。
public class MyType<T> { private readonly T field; public MyType(T value) { field = value; } }
他们可以,没有必要再告诉构造函数“T是什么”,就像你在课堂上已经做过的那样。
也你的工厂是不正确的,你需要有public class MyTypeFactory<T>
不只是public class MyTypeFactory
– 除非你在MyType
类中声明工厂
编辑更新:
那么,42是一个长,一个短,一个整数,还是其他的东西?
假设你有以下几点
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);
genericstypes推断不能在你想要的构造函数上工作的主要原因是因为当你声明的所有types都是“MyType <T>”时,类“MyType”不存在。 请记住,同时具备以下两项是合法的
public class MyType<T> { }
和
public class MyType { }
两者都是合法的。 如果你事实上同时声明了两个语句,那么你将如何消除语法歧义,并且他们都声明了一个冲突的构造函数。
构造函数需要与类本身具有相同的通用规范。 否则就不可能知道你的例子中的int
是与类还是构造函数有关。
var obj = new MyType<int>(42);
这是类MyType<T>
与构造函数MyType(int)
或类MyType
与构造函数MyType<T>(T)
?
尽pipe之前已经回答了很多次,但我觉得我需要澄清一件事情:C# 支持对构造函数进行genericstypes推断。 问题是,它不支持向构造函数中添加generics参数,也不支持genericstypes推断。 想要推断types本身的genericstypes参数基本上与需要Foo.Bar(0)
推断为Foo<int>.Bar(0)
。