Can structs really not be null in C#?

半城伤御伤魂 提交于 2019-12-04 15:15:11

问题


Below is some code that demonstrates I cannot declare and initialize a struct type as null. The Nullable type is a struct, so why am I able to set it to 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");
}

Where Foo is defined as

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; }
    }
}

The question has been answered (see below). To clarify I'll post an example. The C# code:

using System;

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

produces the following 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

a and b are declared, but only b is initialized.


回答1:


The C# compiler provides you with a bit of sugar so you really are doing this:

Nullable<bool> b = new Nullable<bool>();

Here is the syntactic sugar

bool? b = null;    
if (b ?? false) 
{
   b = true;
}



回答2:


C# has some syntax sugar that allows you to appear to set a nullable type to null. What you are actually doing under the covers is setting the nullable type's HasValue property to false.




回答3:


Because you're not actually setting the Nullable<T> variable to null. The struct is still there. It represents null via an internal bit flag in the struct.

There's also some compiler sugar to make magic happen behind the scenes.




回答4:


You can't set a structure to null, but you can have implicit type conversions, which is what is happening under the hood.



来源:https://stackoverflow.com/questions/6077453/can-structs-really-not-be-null-in-c

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!