Могут ли структуры действительно не быть нулевыми в C #?

Ниже приведен код, демонстрирующий, что я не могу объявить и инициализировать тип структуры как null. Тип Nullable - это структура, так почему я могу установить для него значение null ?

Nullable b = null;
if (b.HasValue)
{
    Console.WriteLine("HasValue == true");
}

//Does not compile...
Foo f = null;
if (f.HasValue)
{
    Console.WriteLine("HasValue == true");
}

Где Foo определяется как

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

На вопрос был дан ответ (см. Ниже). Чтобы пояснить, я опубликую пример. Код C #:

using System;

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

дает следующий 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 a,
           [1] valuetype [mscorlib]System.Nullable`1 b)
  IL_0000:  nop
  IL_0001:  ldloca.s   b
  IL_0003:  initobj    valuetype [mscorlib]System.Nullable`1
  IL_0009:  ret
} // end of method Program::Main

объявлены a и b, но инициализируется только b.

28
задан Nate 20 May 2011 в 21:20
поделиться