问题
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