如果T是类型arg?</t>,如何使用Nullable <t>

时间:2011-10-09 18:52:34

标签: .net generics nullable

class Test<T>
{
    T? obj;
}

错误:

  

类型'T'必须是不可为空的值类型才能将其用作   泛型类型或方法'System.Nullable'

中的参数'T'

我需要为类型T保留一个可能为空的引用,但是T可以是值类型或引用类型,如果T是引用类型,则不能有Nullable<T>。任何解决方案?

2 个答案:

答案 0 :(得分:12)

只有值类型可以为空(引用类型本质上已经可以为空)。因此,您可以应用与Nullable<T>类相同的通用约束:

class Test<T> where T: struct
{
    T? obj;
}

当然与以下内容相同:

class Test<T> where T: struct
{
    Nullable<T> obj;
}

并说明泛型参数必须满足相同的约束。

答案 1 :(得分:0)

如果您需要同时支持Test<T>中的类和结构,则无法使用where T : struct约束,并且您将无法直接支持T?,尽管您可以实现通过T?的语义来实现期望的效果。

class Test<T>
{
    T obj;
    bool hasValue; 
}

因此,您将使用obj,首先检查hasValue以查看它是否处于可用状态(“非空”)。

您可以更进一步,并将其封装为基本上滚动您自己的可空包装器(可能将其嵌套在Test内,以便不使其成为公开可见API的一部分)以支持类和引用类型。虽然它是多余的,但它会将当前单独的null类和null结构的概念汇集在一起​​。