如何指定.net泛型约束中不允许的类型
本文关键字:不允许 类型 约束 何指定 net 泛型 | 更新日期: 2023-09-27 18:05:58
是否可以在泛型类上指定不允许某些类型的约束?我不知道这是否可能,如果是的话,我不确定语法是什么。比如:
public class Blah<T> where : !string {
}
我似乎找不到任何允许这种约束的符号
你能得到的最接近的是运行时约束。
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提供的参数)