以下代码无法编译,产生一个“Widget必须是具有公共无参数构造函数的非抽象类型”错误。我会认为编译器拥有它需要的所有信息。这是一个错误?疏忽?还是有一些情况下,这将无效?为什么new()通用约束不满足在构造函数中带有可选参数的类?
public class Factory<T> where T : new()
{
public T Build()
{
return new T();
}
}
public class Widget
{
public Widget(string name = "foo")
{
Name = name;
}
public string Name { get; set; }
}
public class Program
{
public static void Main()
{
var widget = new Widget(); // this is valid
var factory = new Factory<Widget>(); // compiler error
}
}
寻呼Eric Lippert ....我认为这将是可选参数是一个编译器功能,但通用约束是CLR。所以可选参数被编译器替代,并且JIT只会看到(需要)参数。 – Richard 2010-04-30 17:29:01
@Richard:基本上这是问题。可选参数对版本控制也有一些奇怪的副作用,正是由于这个原因... – 2010-04-30 17:33:30