C# 如何指定.NET泛型约束中不允许的类型?
是否可以在不允许某些类型的泛型类上指定约束?我不知道这是否可能,如果可能的话,我不确定语法会是什么。比如:C# 如何指定.NET泛型约束中不允许的类型?,c#,.net,generics,constraints,C#,.net,Generics,Constraints,是否可以在不允许某些类型的泛型类上指定约束?我不知道这是否可能,如果可能的话,我不确定语法会是什么。比如: public class Blah<T> where : !string { } 公共类废话,其中:!串{ } 我似乎找不到任何允许此类约束的符号。不,您不能直接指定“否定”类型约束。约束只能是正约束,如中所述 您只能指定哪些类型可以放入泛型类型,但不能指定哪些类型不能放入泛型类型。以下是允许的约束() 其中T:struct T:在哪里上课 其中T:new() 其中T:[
public class Blah<T> where : !string {
}
公共类废话,其中:!串{
}
我似乎找不到任何允许此类约束的符号。不,您不能直接指定“否定”类型约束。约束只能是正约束,如中所述
您只能指定哪些类型可以放入泛型类型,但不能指定哪些类型不能放入泛型类型。以下是允许的约束()
- 其中T:struct
- T:在哪里上课
- 其中T:new()
- 其中T:[基类名称]
- 其中T:[接口名称]
- 其中T:U(为T提供的类型参数必须是或派生自为U提供的参数)
Blah
类型的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.");
}
}
}
公共类废话{
静态废话{
//此代码每T只运行一次,而不是每次运行一次
//即使对于有效的非字符串类型Ts,也可以调用new Blah()
if(typeof(T)=typeof(string)){
抛出新的NotSupportedException(“不支持'string'类型参数”);
}
}
}
显然不理想,但如果您将此约束放在适当的位置并记录
string
不是受支持的类型参数(例如,通过XML注释)这一事实,您应该接近编译时约束的有效性。不认为这是可能的-但是为什么您需要这样的东西?当有人试图传入不受支持的类型时,您希望的行为是什么?我实际上是试图排除字符串类型,但事实证明,使用where T:struct可以实现我的目标,因为我的类无论如何都不能用于复杂类型。出于兴趣,我试图找出需要这种行为的原因。是否有一种间接方法,比如断言typeof(T)不是吗?@SirPentor不是类型约束的一部分,尽管您可以在代码中执行类似的操作。通常,我会将C#中不可表达的约束放入类构造函数中。要包含可解析为字符串的类型,请:if(typeof(string).IsAssignableFrom(typeof(T)),抛出new NotSupportedException