A continuación se muestra un código que demuestra que no puedo declarar e inicializar un tipo de estructura como nulo. El tipo Nullable es una estructura, entonces ¿por qué puedo configurarlo como nulo?¿Pueden las estructuras realmente no ser nulas 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");
}
Dónde Foo
se define como
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 pregunta ha sido contestada (véase más adelante). Para aclarar, publicaré un ejemplo. El código C#:
using System;
class Program
{
static void Main(string[] args)
{
Nullable<bool> a;
Nullable<bool> b = null;
}
}
produce el siguiente 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 y b son declarados, pero sólo b se inicializa.
Foo? f = nulo; // Compila –
@Forgotten Semicolon, no es el punto de la pregunta. –
Si todavía tiene curiosidad, intente ejecutar 'b.GetType()' después de haber demostrado correctamente que 'b.HasValue' es falso. Esto demuestra una forma en que un tipo que admite nulos no es lo mismo que una estructura, ya que puedes desreferenciar el valor nulo 'nulo' para acceder a HasValue o incluso al método Equals, pero cualquier operación que encasilla el valor nulo arrojará un verdadero nulo. –