结合struct和new()泛型类型约束

时间:2011-11-19 00:12:46

标签: c# generics c#-4.0

recently有理由仔细阅读Nullable文档,我注意到Nullable的定义如下:

public struct Nullable<T> where T : struct, new()

我是(错误的)理解结构总是有一个公共的无参数构造函数,如果这是正确的,new()类型约束在这里添加了什么?

3 个答案:

答案 0 :(得分:2)

对于struct new没有意义。对于它所做的课程。

在您的情况下,这是多余的。

public T FactoryCreateInstance<T>() where T : new()
{
return new T();
}

在上述情况下指定新约束是有意义的,但是当它已经被约束为struct时则不行。

值类型的参数less构造函数是C#限制而不是CLI限制。也许这就是为什么它为了将来留下一些摆动空间而被冗余地指定。

答案 1 :(得分:1)

它不必具有无参数构造函数,即使它具有无参数构造函数,也不必是公共构造函数。我相信“new()”要求它拥有这两样东西。

编辑:是的,根据MSDN文档:“新约束指定泛型类声明中的任何类型参数必须具有公共无参数构造函数。”

答案 2 :(得分:1)

注意这是有效的,可验证的IL(即

 .class public sequential ansi sealed StructNewStruct`1<valuetype .ctor ([mscorlib]System.ValueType) T>
     extends [mscorlib]System.ValueType

编译,更简单的

 .class public sequential ansi sealed StructNewStruct`1<valuetype .ctor T>
     extends [mscorlib]System.ValueType

)但我还没有代码可以做一些简单的where T:struct(或VB.NET中的(Of T As Structure)和IL中的<valuetype T>)。

具体来说,Nullable结构已经不允许用于具有简单struct约束的任何泛型参数。 (似乎Nullable个对象几乎是所有目的的类,除了存储。)

因此,总而言之,Nullable<T>的当前(相当于)where T:ValueType, struct, new()似乎与where T:struct相同。

为了您的信息,我使用了更新的DotLisp,允许创建泛型类型(仅使用MakeGenericType)来尝试创建StructNewStruct<t>StructStruct<t>类型(* )对于4.0框架的所有程序集中的所有类型,加载时我没有尝试加载“异常”程序集(例如System.Web可能尚未加载)。 (如果“模糊”框架程序集中有任何“特殊”类型,请告诉我,我将确保它们已加载并尝试。)所有类型都成功或失败了两种结构。

(*)StructStruct<T> where T:struct