有没有办法让C#泛型方法接受具有默认参数的类型的新约束?我尝试使用下面的TestGenerics<PublicDefaultParameter>()
执行此操作,并且它给了CS0310&#34;必须有一个公共无参数构造函数&#34;错误。
有没有办法让内部C#泛型方法调用内部构造函数?我尝试使用下面的TestGenerics<InternalParameterless>()
执行此操作,并得到相同的错误。
作为一名缺乏经验的C#程序员,在其他语言方面有经验,这些限制对我来说似乎完全是武断的 - 有没有办法理解这个?
public class PublicParameterless
{
public PublicParameterless() {}
}
public class PublicDefaultParameter
{
public PublicDefaultParameter(int i=0) {}
}
public class InternalParameterless
{
internal InternalParameterless() {}
}
public class Test
{
public static T TestGenerics<T>() where T : new()
{
return new T();
}
public static InternalParameterless TestNonGenericCaller()
{
return new InternalParameterless();
}
public static void Main()
{
TestGenerics<PublicParameterless>();
//TestGenerics<PublicDefaultParameter>(); // error CS0310: The type `PublicDefaultParameter' must have a public parameterless constructor...
//TestGenerics<InternalParameterless>(); // error CS0310: The type `InternalParameterless' must have a public parameterless constructor..
TestNonGenericCaller();
}
}
答案 0 :(得分:1)
默认参数确实是来电者网站上的语法糖。从框架的角度来看,它只是带有一个参数的构造函数。
(正确的心理模型:C#中的许多构造都不是编译时的语法结构,而是编译代码中存在的真正的烘焙结构。特别是,泛型确实存在于编译代码中,与C ++相比,其中a模板类在运行时只是一个类。同样的故事是默认参数:它不是关于语法可调用性。)