我怎样才能保证T是班级?

Vas*_*sya 4 .net c# generics

我有下一个代码:

public static T GetSerializedCopy<T> (T src)
{
  //some code to obtain a copy
}
Run Code Online (Sandbox Code Playgroud)

我怎么能保证T会成为一个类,而不是结构或枚举或其他东西?

Mar*_*ell 21

认为添加到泛型方法/类型声明可以实现这一点是一个常见的错误(请参阅此处的答案)where T : class- 但这是错误的.这实际上意味着" T必须是一个引用类型",它也包括代理和接口(加上数组等string).

如果你想上课,有两种方法; 最简单的是坚持where T : class, new(),因为接口和委托都不能拥有构造函数.但是,在拒绝没有公共无参数构造函数的类方面,这确实存在漏报.

唯一的另一种方式是在运行时:

if(!typeof(T).IsClass) throw new InvalidOperationException("T must be a class");
Run Code Online (Sandbox Code Playgroud)

同样,where T : struct也不代表" T必须是一种价值型"!它意味着" T必须是一个不可空的价值型"; 涉及的类型Nullable<>不满足T : struct,尽管事实Nullable<Foo> a struct.


小智 7

public static T GetSerializedCopy<T> (T src) where T : class
Run Code Online (Sandbox Code Playgroud)

这是通用类型约束的MSDN链接.