C#Generics Strange Internal&默认参数行为

时间:2014-12-19 01:21:00

标签: c# generics

有没有办法让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();
    }
}

1 个答案:

答案 0 :(得分:1)

默认参数确实是来电者网站上的语法糖。从框架的角度来看,它只是带有一个参数的构造函数。

(正确的心理模型:C#中的许多构造都不是编译时的语法结构,而是编译代码中存在的真正的烘焙结构。特别是,泛型确实存在于编译代码中,与C ++相比,其中a模板类在运行时只是一个类。同样的故事是默认参数:它不是关于语法可调用性。)