c# - 为什么 Nullable<T> 被视为结构而不是类?

标签 c# generics nullable type-constraints

我正在尝试定义一个泛型类,它采用可以设置为 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>不满足 classstruct约束。没有只允许可空类型的约束(引用或 Nullable<T> )。

关于c# - 为什么 Nullable<T> 被视为结构而不是类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20588711/

相关文章:

c# - 最大长度输入属性的最大长度注释

java - 正确使用java泛型?

c# - 无法访问我在泛型方法中用作类型参数的类的基类的属性

c# - System.InvalidOperationException : Nullable object must have a value. ASP.NET MVC

c# - 了解 IIS 对 C# 开发人员有多重要?

c# - 使用 MVVM、 Entity Framework 和 mysql 将基本数据绑定(bind)到文本框

c# - ASP.NET不显示用户控件C#

java - 创建未知类型的数组

java - 为什么基元不能为空

kotlin - 为什么 Kotlin '===' 引用相等运算符对相同的对象引用返回 false?