c# - 测试泛型方法参数是否为类

标签 c# generics constraints

我有一个带有此签名的通用方法:

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实际上并不意味着 Tstruct - 这意味着它不是 Nullable<> 的结构.

关于c# - 测试泛型方法参数是否为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224836/

相关文章:

c# - Guid 构造函数在明显有效的字符串上抛出 formatException

Kotlin - Void vs. Unit vs. Nothing

mysql - 如何在两个字段上创建 'Two-Sided' 唯一索引?

c# - CFind 在研究级别失败 - 不支持 SOP 类或找不到抽象语法的可接受表示上下文

c# - 如何可视化 XAML

c# - 在单个服务中同时使用 DataContractSerializer 和 XmlSerializer

c# - foreach 与 someList.ForEach(){}

java - 正确的 Java 泛型类的类型转换(或任何其他方法)

javascript - 删除 Sequelize 迁移中的约束

iOS 自动布局问题 - 即使没有约束 subview 也会错位