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

本文关键字:泛型类型 约束 new struct 结合 | 更新日期: 2023-09-27 18:15:05

最近有理由仔细阅读Nullable文档,我注意到Nullable的定义看起来像:

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

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

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

For struct new没有意义。

对你来说这是多余的。

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

在上面这样的情况下指定新的约束是有意义的,但当它已经被约束为struct时就没有意义了。

值类型的无参数构造函数是c#的限制,而不是CLI的限制。

不必有无参数构造函数,即使有,也不必是公共构造函数。我认为"new()"需要同时具备这两个条件。

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

注意这是有效的,可验证的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(或(Of T As Structure)在VB。. NET和<valuetype T>在IL)提供。

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

因此,综上所述,Nullable<T>当前(相当于)where T:ValueType, struct, new()当前似乎与where T:struct相同。

为了您的信息,我使用了我更新的DotLisp,允许创建泛型类型(仅使用MakeGenericType),试图在4.0框架的所有程序集中为所有类型创建StructNewStruct<t>StructStruct<t>(*)类型,而无需我尝试加载"不寻常"程序集(例如System.Web可能尚未加载)。(如果在"晦涩的"框架程序集中有任何"特殊"类型,请告诉我,我会确保它们被加载并尝试过。)

(*) StructStruct<T> where T:struct