Voici un code qui démontre que je ne peux pas déclarer et initialiser un type struct comme nul. Le type Nullable est une structure, alors pourquoi suis-je capable de le mettre à null?Les structs ne peuvent-ils vraiment pas être NULL en C#?
Nullable<bool> b = null;
if (b.HasValue)
{
Console.WriteLine("HasValue == true");
}
//Does not compile...
Foo f = null;
if (f.HasValue)
{
Console.WriteLine("HasValue == true");
}
Où Foo
est défini comme
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; }
}
}
La question a été répondue (voir ci-dessous). Pour clarifier, je vais poster un exemple. Le code C#:
using System;
class Program
{
static void Main(string[] args)
{
Nullable<bool> a;
Nullable<bool> b = null;
}
}
produit l'IL suivante:
.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 et b sont déclarés, mais seulement b est initialisé.
Foo? f = null; // Compile –
@Fogotten Point-virgule, pas le point de la question. –
Si vous êtes toujours curieux, essayez d'exécuter 'b.GetType()' après avoir réussi à montrer que 'b.HasValue' est faux. Cela illustre une façon dont un type nullable n'est pas la même chose qu'une structure, puisque vous pouvez déréférencer la nullable 'null' pour accéder à HasValue ou même la méthode Equals, mais toute opération qui encadre le nullable retournera une vraie valeur nulle. –