为什么Nullable类型必须具有struct约束

时间:2014-07-20 16:28:29

标签: c# oop struct

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(SomeFunction<int>()==null);
        var temp = new SomeClass<int>();
        Console.WriteLine(temp.SomeFunction() == null);
        Console.ReadKey();
    }

    static public T? SomeFunction<T>() where T : struct
    {
        return null;
    }

    public class SomeClass<T> where T : struct 
    {
        public T? SomeFunction()
        {
            return null;
        }
    }
}

在上面的例子中,为什么可空类型需要结构约束?
我不明白为什么struct是正确的语法而不是对象或类。

3 个答案:

答案 0 :(得分:8)

因为Nullable<T>(或T?)也将T限制为结构。

因此,要使SomeFunction<T>的通用类型参数T满足Nullable<T>的要求,SomeFunction<T>必须声明相同的约束

以下是约束必须传播的另一个例子

interface ISomeInterface { }
class MyClass<T> where T: ISomeInterface { }

class Program
{
    //MyClass's constaints must be "re-declared" here
    public MyClass<T> SomeFunction<T>() where T : ISomeInterface
    {
    }
}

为什么Nullable<T>会这样做?因为可以为空的引用类型没有任何意义。 Refence类型 已经可以为空。

答案 1 :(得分:2)

T?Nullable<T>的简写,Nullable<T>要求T为结构:

public struct Nullable<T> where T : struct

答案 2 :(得分:0)

Nullable<T>是一个结构(参见MSDN)但是它是唯一不满足结构约束的结构。另外,当使用类或结构约束时,不能将Nullable用作泛型类型参数。

Nullable<T>的基本思想是拥有一个可以包含T的存储位置,或者可以代表&#34;该值缺失&#34;