如何指定.net泛型约束中不允许的类型

本文关键字:不允许 类型 约束 何指定 net 泛型 | 更新日期: 2023-09-27 18:05:58

是否可以在泛型类上指定不允许某些类型的约束?我不知道这是否可能,如果是的话,我不确定语法是什么。比如:

public class Blah<T> where : !string {
}

我似乎找不到任何允许这种约束的符号

如何指定.net泛型约束中不允许的类型

你能得到的最接近的是运行时约束。

Edit:最初我将运行时检查放在构造函数调用中。这实际上不是最优的,因为它会在每次实例化时产生开销;我相信将检查放在静态构造函数中会更明智,它将作为Blah<T>类型的T参数在每个类型中调用一次:

public class Blah<T> {
    static Blah() {
        // This code will only run ONCE per T, rather than every time
        // you call new Blah<T>() even for valid non-string type Ts
        if (typeof(T) == typeof(string)) {
            throw new NotSupportedException("The 'string' type argument is not supported.");
        }
    }
}

显然不是理想的,但是如果您将此约束放在适当的位置记录string不是受支持的类型参数(例如,通过XML注释)的事实,您应该在接近的地方获得编译时约束的有效性。

不能直接指定"否定"类型约束

约束只能是正面约束,如文档中所述。

你唯一能做的就是指定哪些类型可以放入泛型类型中,但是你不能指定哪些不能放入泛型类型中。

以下是允许的约束(更多细节)

  • where T: struct
  • T: class
  • where T: new()
  • where T:[基类名]
  • where T:[接口名]
  • where T: U(为T提供的类型参数必须是或派生于为U提供的参数)