我有一个带有此签名的通用方法:
private void MyGenericMethod<T>(T arg) where T : class
{}
如果我向此方法传递一个整数,我会收到一个 ArgumentException,表明传递的值与限制不匹配。这很棒,但是我如何预先确定我传递的内容将与“类”约束匹配,以便不会引发异常?
最佳答案
编译器已经为你做到了这一点 - 你实际上应该看到:
The type 'int' must be a reference type in order to use it as parameter 'T' in the generic type or method 'blah.MyGenericMethod(T)'
在编译时。
棘手的场景是:
- 泛型之上的泛型之上的泛型 - 所有这些类型约束都堆叠起来,所以你最终得到
where T : class
很多。有时最好对T
使用运行时验证 - 反射(
MakeGenericMethod
等) - 同样,只需在运行时检查
另外,请注意 where T : class
实际上并不意味着 T
是一个类 - 这意味着它是一个引用类型,可以包含接口(interface)和委托(delegate)。同样,where T : struct
实际上并不意味着 T
是 struct
- 这意味着它不是 Nullable<>
的结构.
关于c# - 测试泛型方法参数是否为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224836/