我有下一个代码:
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)