Подтвердить что ты не робот

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

Ниже приведен код, демонстрирующий, что я не могу объявить и инициализировать тип структуры как null. Тип Nullable является структурой, поэтому почему я могу установить его на 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");
}

Где 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; }
    }
}
Ответ на вопрос (см. ниже). Чтобы уточнить, я отправлю пример. Код С#:
using System;

class Program
{
    static void Main(string[] args)
    {
        Nullable<bool> a;
        Nullable<bool> 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<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 и b объявляются, но инициализируется только b.

4b9b3361

Ответ 1

Компилятор С# предоставляет вам немного сахара, так что вы действительно делаете это:

Nullable<bool> b = new Nullable<bool>();

Вот синтаксический сахар

bool? b = null;    
if (b ?? false) 
{
   b = true;
}

Ответ 2

В С# есть синтаксический сахар, который позволяет вам установить тип с нулевым значением на null. То, что вы на самом деле делаете под обложками, устанавливает для свойства HasValue значение типа nullable false.

Ответ 3

Потому что вы на самом деле не устанавливаете переменную Nullable<T> в null. Структура все еще существует. Он представляет null через внутренний бит в структуре.

Там также есть сахара-компилятор, чтобы сделать волшебство за кулисами.

Ответ 4

Вы не можете установить для структуры значение null, но вы можете иметь неявные преобразования типов, что и происходит под капотом.