Können Strukturen in C # wirklich nicht null sein?
Unten ist ein code, der demonstriert, kann ich nicht deklarieren und initialisieren Sie ein struct-Typ als null. Die Null-Werte zulässt Typ ist ein struct, also warum bin ich in der Lage, es auf 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");
}
Wo Foo
ist definiert als
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; }
}
}
Wurde die Frage beantwortet (siehe unten). Um zu klären, poste ich ein Beispiel. Der C# - code:
using System;
class Program
{
static void Main(string[] args)
{
Nullable<bool> a;
Nullable<bool> b = null;
}
}
erzeugt die folgende 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 und b deklariert sind, sondern nur b ist initialisiert.
InformationsquelleAutor der Frage Nate | 2011-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den C# - compiler stellt Sie mit ein bisschen Zucker, so dass Sie wirklich das tun:
InformationsquelleAutor der Antwort ChaosPandion
C# hat einige syntax-Zucker, der Ihnen erlaubt, zu erscheinen, um einen nullable type zu
null
. Was Sie eigentlich tun, unter der Decke ist die Einstellung der nullable-Typ istHasValue
Eigenschaftfalse
.InformationsquelleAutor der Antwort Andrew Hare
Weil Sie nicht wirklich die Einstellung der
Nullable<T>
variablenull
. Die Struktur ist immer noch da. Es stelltnull
über einen internen bit-flag in der Struktur.Gibt es auch einige compiler Zucker zu machen die Magie geschehen hinter den kulissen.
InformationsquelleAutor der Antwort Nicholas Carey
Kann man nicht von einer Struktur auf null, aber Sie können implizite Typ-Konvertierungen, die ist, was Los ist unter der Haube.
InformationsquelleAutor der Antwort jmoreno