如何初始化通用参数类型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(); ... }
这仅对具有默认构造函数的类型有效。
T
的where
子句是generics类型约束 。 在这种情况下,它要求应用此方法的任何类型必须具有公共无参数构造函数。
如果您确实需要T的实例而不是引用类型的默认空值,请使用:
Activator.CreateInstance()
您可以使用default
构造将其设置为Type的默认值。
default关键字允许您告诉编译器在编译时应该使用此变量的默认值。 如果提供的type参数是数值(例如,int,long,decimal),则默认值为零。 如果提供的type参数是引用类型,则默认值为null。 如果提供的类型参数是结构,则通过将结构的每个成员字段初始化为数字类型的零或引用类型为null来确定结构的默认值。
使用类似的东西:
T data = default(T);
有关详细信息,请阅读: 将通用变量初始化为其默认值