我正在尝试定义一个泛型类,它接受任何可以设置为null的类型:
public abstract class BundledValue_Classeswhere T : class { private Tuple _bundle= new Tuple (); public T Value { get { return _bundle == null ? null : _bundle.Item1; } set { _bundle = new Tuple (value, obj); } } //...
这很好用.我还想创建一个派生类,它可以采用任何原始类型(int,double等),并简单地将其解析为与上面的类相同,但原语包含在Nullable中
public abstract class BundledValue_Structs: BundledValue_Classes where T : struct { //... }
但由于某种原因,这不起作用.我收到错误:The type 'T?' must be a reference type in order to use it as parameter 'T' in the generic type or method 'BundledValue_Classes
我明白在这里要做什么?我不想复制粘贴整个BundledValue_Classes
类的内容只是为了处理包含在一个原语的情况Nullable
.
也许有一些方法可以设置类型约束,BundledValue_Classes
这样它就不仅可以接受类,还可以接受任何可以赋值为null的Nullable
类型(包括类型,这似乎是规则的唯一例外.)
Nullable<T>
是一个结构,根据文档.它根本不是一个阶级.它是一个值类型,在字段方面看起来有点像这样:
public struct Nullable<T> { private readonly T value; private readonly bool hasValue; }
类型的null
值Nullable<T>
不是空引用,它只是hasValue
字段为false 的值.
但是请注意,Nullable<T>
它不满足约束条件where TFoo : struct
,因为它实际上是一个不可为空的值类型约束.基本上Nullable<T>
不满足class
或struct
约束.有没有约束它确实只允许可空类型(参考或Nullable<T>
).