"."оператор на нуль обнуляемый - PullRequest
1 голос
/ 05 декабря 2011

Как получается, что вы можете получить доступ к null свойство nullable HasValue?
Я посмотрел на скомпилированный код, и это не синтаксический сахар.

Почему это не вызывает исключение NullReferenceException:

int? x = null;
if (x.HasValue)
{...}

Ответы [ 2 ]

11 голосов
/ 05 декабря 2011

Это потому, что int? - это сокращение от Nullable<int>, которое является типом значения, а не ссылочным типом, поэтому вы никогда не получите NullReferenceException.

Структура Nullable<T> выглядит примерно так:

public struct Nullable<T> where T : struct
{
    private readonly T value;
    private readonly bool hasValue;
    //..
}

Когда вы присваиваете null, происходит некоторая магия при поддержке компилятора (который знает о Nullable<T> и обрабатывает их особенным образом), который просто устанавливает для поля hasValue значение false для этого экземпляра - что затем возвращается свойством HasValue.

1 голос
/ 05 декабря 2011

Как BrokenGlass сказал, int? на самом деле Nullable<T>.

Структуры всегда содержат значение. Обычно вы не можете установить структурную переменную на ноль, но в этом особом случае вы можете, по существу, установить ее на default(Nullable<T>). Это устанавливает его содержимое на ноль, а не на саму переменную.

Когда вы устанавливаете Nullable<T> в значение, он использует неявный оператор для установки Value = value в новое значение и HasValue = true.

Когда вы устанавливаете Nullable<T> на ноль, он обнуляет все поля структуры. Для поля bool, такого как HasValue, null == false.

Поскольку переменная Nullable<T> является структурой, на нее всегда можно ссылаться, поскольку ее содержимое является нулевым, а не самой переменной.

Дополнительная информация о структурах приведена в разделе «Примечания» на странице MSDN. struct .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...