在C#中,结构体真的不能为空吗?

Nat*_*ate 29 c# struct nullable

下面是一些代码,演示了我无法将结构类型声明和初始化为null.该可空类型是一个结构,所以为什么我可以将它设置为空?

Nullable<bool> b = null;
if (b.HasValue)
{
    Console.WriteLine("HasValue == true");
}

//Does not compile...
Foo f = null;
if (f.HasValue)
{
    Console.WriteLine("HasValue == true");
}
Run Code Online (Sandbox Code Playgroud)

在哪里Foo定义为

public struct Foo
{
    private bool _hasValue;
    private string _value;

    public Foo(string value)
    {
        _hasValue = true;
        _value = value;
    }

    public bool HasValue
    {
        get { return _hasValue; }
    }

    public string Value
    {
        get { return _value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题已得到解答(见下文).为了澄清我会发布一个例子.C#代码:

using System;

class Program
{
    static void Main(string[] args)
    {
        Nullable<bool> a;
        Nullable<bool> b = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

产生以下IL:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] valuetype [mscorlib]System.Nullable`1<bool> a,
           [1] valuetype [mscorlib]System.Nullable`1<bool> b)
  IL_0000:  nop
  IL_0001:  ldloca.s   b
  IL_0003:  initobj    valuetype [mscorlib]System.Nullable`1<bool>
  IL_0009:  ret
} // end of method Program::Main
Run Code Online (Sandbox Code Playgroud)

声明了a和b,但只初始化了b.

Cha*_*ion 25

C#编译器为您提供了一点糖,所以你真的这样做:

Nullable<bool> b = new Nullable<bool>();
Run Code Online (Sandbox Code Playgroud)

这是语法糖

bool? b = null;    
if (b ?? false) 
{
   b = true;
}
Run Code Online (Sandbox Code Playgroud)


And*_*are 13

C#有一些语法糖,可以让你看起来设置一个可以为空的类型null.你实际上在幕后做的是将可空类型的HasValue属性设置为false.