我正在尝试定义一个泛型类,它采用可以设置为 null 的任何类型:
public abstract class BundledValue_Classes<T>
where T : class
{
private Tuple<T, object> _bundle= new Tuple<T, object>();
public T Value
{
get { return _bundle == null ? null : _bundle.Item1; }
set { _bundle = new Tuple<T, object>(value, obj); }
}
//...
这很好用。我还想创建一个可以采用任何原始类型(int、double 等)的派生类,并将其简单地解析为与上述类相同的类,但原始类包含在 Nullable 中
public abstract class BundledValue_Structs<T>
: BundledValue_Classes<T?>
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<T>'
我想在这里做什么很清楚吗?我不想复制粘贴整个 BundledValue_Classes<T>
的内容类只是为了处理包装在 Nullable<T>
中的原语的情况.
也许有一些方法可以在 BundledValue_Classes<T>
上设置类型约束这样它不仅接受类,而且接受任何可以分配空值的类型(包括 Nullable<T>
类型,这似乎是该规则的唯一异常(exception)。)
最佳答案
Nullable<T>
是一个结构,as per the documentation .它根本不是一个类。它是一个值类型,从字段上看有点像这样:
public struct Nullable<T>
{
private readonly T value;
private readonly bool hasValue;
}
null
Nullable<T>
的值类型不是空引用,它只是一个值,其中 hasValue
字段为假。
请注意 Nullable<T>
不满足 where TFoo : struct
约束的条件但是,因为这实际上是一个不可空 值类型约束。基本上 Nullable<T>
不满足 class
或 struct
约束。没有只允许可空类型的约束(引用或 Nullable<T>
)。
关于c# - 为什么 Nullable<T> 被视为结构而不是类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20588711/