Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么会有一个可为null的<;T>;结构和可空类?_C#_Nullable - Fatal编程技术网

C# 为什么会有一个可为null的<;T>;结构和可空类?

C# 为什么会有一个可为null的<;T>;结构和可空类?,c#,nullable,C#,Nullable,有一个Nullablestruct,还有一个静态Nullable类,包含三个静态方法 我的问题是,为什么静态Nullable类中的这些静态方法不能进入Nullable结构?将它们定义为两种不同类型的原因是什么 还有一个INullable接口。它做什么 泛型的标准做法是使用与泛型类同名的类以及与泛型类相关的实用方法。因为当您使用泛型类时,您无法在类型声明中推断泛型,最终将得到更多的字符。 看看如果静态方法放在泛型类中会是什么样子: Nullable<int?>.Compare(x, Y

有一个
Nullable
struct,还有一个静态
Nullable
类,包含三个静态方法

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

还有一个
INullable
接口。它做什么

  • 泛型的标准做法是使用与泛型类同名的类以及与泛型类相关的实用方法。因为当您使用泛型类时,您无法在类型声明中推断泛型,最终将得到更多的字符。 看看如果静态方法放在泛型类中会是什么样子:

    Nullable<int?>.Compare(x, Y);
    var n = new Tuple<int,string>(10, "Text");
    
    我把Tuple作为另一个例子

  • 接口和基类在泛型中非常有用,因为结构是可空的,而结构不能有基类,所以我们只剩下接口。下面是它的一个可能用法

    {
        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 .. 
        }
    }
    

  • 它们是一个单独的类,因为这些方法是实用方法,可以在任何地方使用,而不必每次使用这些方法时都创建一个
    null
    结构实例

    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;
    }
    
    公共静态bool Is(此T变量,类型){
    如果(var!=null){
    类型currentType=variable.GetType();
    类型=可空。GetUnderlineType(类型)??类型;
    while(currentType!=typeof(object)){
    if(currentType==类型){
    返回true;
    }
    currentType=currentType.BaseType;
    }
    }                  
    返回false;
    }
    
    在上面的示例中,变量可以是任何类型(不一定是
    nullable
    ),但实际上它可以是
    nullable
    ,因此必须检查
    nullable


    对于这种情况,我使用了
    Nullable.getunderyingtype(type)
    ,因为它是一种实用方法。这是实用方法的预期行为,即使它们可以在任何需要的地方重用,而无需每次需要时创建实例

    很好的解释它的可能重复不是重复。@Abion47也许你没有理解我的问题。我从来没有看过一篇关于某些泛型类的非泛型类的文章,但是通过查看.NET framework中的多个泛型类,我得出了这个结论。您可以看到非泛型类Tuple和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;
    }