为什么会有 Nullable<T> 结构和 Nullableclass?

Why is there a Nullable<T> struct and Nullable class?

有一个 Nullable<T> 结构,还有另一个带有三个静态方法的静态 Nullable class。

我的问题是,为什么 static Nullable class 中的这些静态方法不能进入 Nullable<T> 结构?将它们定义为两种不同类型的原因是什么?

并且有一个 INullable 界面,因为 well.What 是吗?

  1. 泛型的标准做法是让 class 与泛型 class 同名,并使用与泛型 class 相关的实用方法。因为当您使用泛型 class 时,您无法推断类型声明中的泛型,您最终会得到更多的字符。 看看如果将静态方法放在通用 class:

    中会怎样
    Nullable<int?>.Compare(x, Y);
    var n = new Tuple<int,string>(10, "Text");
    

    Nullable.Compare(x, Y);
    var n = Tuple.Create(10, "Text");
    

    我把元组作为另一个例子。

  2. 接口和基础 classes 在泛型中非常有用,并且由于 Nullable<> 是结构并且结构不能有基础 class,我们只剩下接口了。下面是它的一种可能用法。

    {
        int? a = 10;
        long? b = 10L;
    
        Process(a);
        Process(b);
    }
    
    private static void Process(INullable value)
    {
        if (value.IsNull)
        {
            // Process for null .. 
        }
        else
        {
            // Process for value .. 
        }
    }
    

它们是单独编写的 class,因为这些方法是实用方法,旨在用于任何地方,而无需在每次要使用这些方法时实际创建一个 nullable 结构实例例如,

public static bool Is<T>(this T variable,Type type) {
    if (var != null) {
        Type currentType = variable.GetType();
        type = Nullable.GetUnderlyingType(type) ?? type;
        while (currentType != typeof(object)) {
            if (currentType == type) {
                return true;
            }
            currentType = currentType.BaseType;
        }
    }                  
    return false;
}

在上面的例子中,变量可以是任何类型(不一定是nullable),但实际上它可以是nullable,因此必须检查是否nullable

对于那种情况,我使用了 Nullable.GetUnderlyingType(type),因为它是一个实用程序 method.This 是实用程序方法的预期行为,即使它们可以在任何需要的地方重复使用,而无需创建实例,每次你需要他们。