类型为<t> </t> </t>的类型为<t>的类<t> </t> </t>

时间:2013-11-26 09:56:14

标签: c# generics nullable

我需要创建一个可以保存以下类型值的类:int?, decimal?, date, bool? string

我希望能够这样做:

var x = new MyClass<int?>()  
x.Value = null;
x.value = 99;         

// or

var y = new MyClass<bool?>();
y.Value = null;
y.Value = true

// and so on

我一直在尝试创建一个类型为T的类:

public class TestClass<T>
{             
    public T? Value{ get; set; }
}

我想使用Value来获取任何允许的类型但我无法使其成为可空的。错误是:

  

只有非可空值类型可能是Sysytem.Nullable

的基础

无论如何都在做我想要实现的目标?

2 个答案:

答案 0 :(得分:13)

试试这个:

public class TestClass<T> where T : struct
{             
    public T? Value{ get; set; }
}

由于class是引用类型,因此类不能为空。您必须为您的泛型类添加约束以仅允许结构(可以为空)。

string是一种引用类型,在这种情况下,您的类不能与string一起使用,因为它不能为空。

答案 1 :(得分:5)

问题是你将一个可空的内容传递给你的泛型,然后尝试使可以为空。

试试这个:

public class TestClass<T>
{             
    public T Value{ get; set; }
}

现在,当你这样做时:

var x = new MyClass<int?>();

值将被定义为int?,因此您可以按照自己的方式使用它。如果将其定义为

var x = new MyClass<int>();

值将定义为int - 并且不接受空值。