class Test<T>
{
T? obj;
}
错误:
类型'T'必须是不可为空的值类型才能将其用作 泛型类型或方法'System.Nullable'
中的参数'T'
我需要为类型T保留一个可能为空的引用,但是T可以是值类型或引用类型,如果T是引用类型,则不能有Nullable<T>
。任何解决方案?
答案 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结构的概念汇集在一起。