如何初始化通用参数类型T?

简单的问题:
如果你有一个string x ,要初始化它,你可以简单地执行以下操作之一:

 string x = String.Empty; 

要么

 string x = null; 

通用参数T怎么样?

我试过了:

 void someMethod(T y) { T x = new T(); ... } 

生成错误:
无法创建变量类型“T”的实例,因为它没有new()约束

你有两个选择:

你可以约束T:你这样做是通过where T : new()你的方法中添加: where T : new() 。 现在,您只能将someMethod与具有无参数的默认构造函数的类型一起使用(请参阅类型参数上的约束 )。

或者您使用default(T) 。 对于引用类型,这将给出null 。 但是,例如,对于整数值,这将给出0 (参见通用代码中的默认关键字 )。

这是一个基本的控制台应用程序,它演示了差异:

 using System; namespace Stackoverflow { class Program { public static T SomeNewMethod() where T : new() { return new T(); } public static T SomeDefaultMethod() where T : new() { return default(T); } struct MyStruct { } class MyClass { } static void Main(string[] args) { RunWithNew(); RunWithDefault(); } private static void RunWithDefault() { MyStruct s = SomeDefaultMethod(); MyClass c = SomeDefaultMethod(); int i = SomeDefaultMethod(); bool b = SomeDefaultMethod(); Console.WriteLine("Default"); Output(s, c, i, b); } private static void RunWithNew() { MyStruct s = SomeNewMethod(); MyClass c = SomeNewMethod(); int i = SomeNewMethod(); bool b = SomeNewMethod(); Console.WriteLine("New"); Output(s, c, i, b); } private static void Output(MyStruct s, MyClass c, int i, bool b) { Console.WriteLine("s: " + s); Console.WriteLine("c: " + c); Console.WriteLine("i: " + i); Console.WriteLine("b: " + b); } } } 

它产生以下输出:

 New s: Stackoverflow.Program+MyStruct c: Stackoverflow.Program+MyClass i: 0 b: False Default s: Stackoverflow.Program+MyStruct c: i: 0 b: False 

使用default关键字。

 T x = default(T); 

请参阅: 通用代码中的默认关键字(C#编程指南)

给定参数化类型T的变量t,语句t = null仅在T是引用类型时有效,并且t = 0仅适用于数值类型而不适用于结构。 解决方案是使用default关键字,它将为引用类型返回null,为数值类型返回零。 对于结构体,它将返回初始化为struct或null的结构的每个成员,具体取决于它们是值还是引用类型。

您需要为类型参数T添加new约束。

 void someMethod(T y) where T : new() { T x = new T(); ... } 

这仅对具有默认构造函数的类型有效。

Twhere子句是generics类型约束 。 在这种情况下,它要求应用此方法的任何类型必须具有公共无参数构造函数。

如果您确实需要T的实例而不是引用类型的默认空值,请使用:

 Activator.CreateInstance() 

您可以使用default构造将其设置为Type的默认值。

default关键字允许您告诉编译器在编译时应该使用此变量的默认值。 如果提供的type参数是数值(例如,int,long,decimal),则默认值为零。 如果提供的type参数是引用类型,则默认值为null。 如果提供的类型参数是结构,则通过将结构的每个成员字段初始化为数字类型的零或引用类型为null来确定结构的默认值。

使用类似的东西:

T data = default(T);

有关详细信息,请阅读: 将通用变量初始化为其默认值