是否可以在C#泛型方法中定义“不可为空”的约束?

在C#中,Nullable< T> type不满足where struct generic约束(而AFAK这在技术上是一个struct).这可用于指定泛型参数必须是不可为空的值类型:

T DoSomething<T>() where T : struct
{
   //... 
} 
DoSomething<int?>(); //not ok
DoSomething<int>();  //ok

当然,Nullable< T>也不满足类约束的引用类型:

T DoSomething<T>() where T : class
{
   //...
} 
DoSomething<int?>(); //not ok
DoSomething<Foo>();  //ok

这是否可以定义约束,例如它必须是引用类型或值类型但不是Nullable值类型?

像这样的东西:

void DoSomething<T>() where T : class, struct //wont compile!
{    
   //...   
} 
DoSomething<int?>(); //not ok
DoSomething<int>();  //ok
DoSomething<Foo>();  //ok

解决方法:

不,在宣言方面是不可能的.它是结构OR类.
但是,您可以在运行时检查typeof(T)以确保T为Nullable< T2>.

Type type = typeof(T);
if(Nullable.GetUnderlyingType(type) == null)
    throw new Exception();
上一篇:c# – 检查nullable是否有值的正确方法


下一篇:C#中Null类型