Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何指定.NET泛型约束中不允许的类型?_C#_.net_Generics_Constraints - Fatal编程技术网

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