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

Почему оператор as может использоваться с Nullable <T>?

В соответствии с документацией as operator, as "используется для выполнения определенных типов преобразований между совместимыми ссылочными типами". Поскольку Nullable на самом деле является значением), я бы ожидал, что as не будет работать с ним. Однако этот код компилируется и запускается:

object o = 7;
int i = o as int? ?? -1;
Console.WriteLine(i); // output: 7

Это правильное поведение? Не соответствует ли документация для as? Я что-то пропустил?

4b9b3361

Ответ 1

Это правильное поведение?

Да.

Является ли документация неправильной?

Да. Я сообщил менеджеру документации. Спасибо, что привлек это к моему вниманию, и извиняюсь за ошибку. Очевидно, никто не помнил, чтобы обновлять эту страницу, когда типы NULL добавлены в язык С# 2.0.

Я что-то пропустил?

Возможно, вам стоит прочитать фактическую спецификацию С#, а не документацию MSDN; он более определен.

Ответ 2

Я читал:

Обратите внимание, что оператор as выполняет только преобразования ссылок и преобразования бокса. Оператор as не может выполнять другие преобразования, такие как пользовательские преобразования, которые вместо этого должны выполняться с использованием выражений-выражений.

И конверсии бокса.....

Ответ 3

Просто догадаться, но я бы сказал, что он помещает o как целое число, а затем преобразует его в нулевое значение.

Ответ 4

Из документации о ключевом слове как:

Это эквивалентно следующему выражению, за исключением того, что выражение оценивается только один раз.

выражение - это тип? (тип): (тип) null

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

int? temp = null;
if (temp is int?)
{
    // Do something
}

Я предполагаю, что это просто неточность в справочной документации в том, что тип должен быть с нулевым значением (т.е. тип с нулевым типом или ссылочный тип) вместо простого ссылочного типа.

Ответ 5

По-видимому, необходимо обновить документацию MSDN на как оператор.

object o = 7;
int i = o as **int** ?? -1;
Console.WriteLine(i);

Если вы попробуете следующий код, в котором мы используем оператор as со значением типа int, вы получите соответствующее сообщение об ошибке компилятора, которое

Оператор as должен использоваться с ссылочным типом или типом с нулевым значением ('int' - тип значения, не допускающий значения NULL)

Существует обновление, хотя на ссылка в разделе Содержимое Сообщества, в котором указано:

The as operator must be used with a reference type or nullable type.

Ответ 6

Вы применяете "как" к объекту, который является ссылочным типом. Он может быть нулевым, и в этом случае CLR имеет специальную поддержку для того, чтобы освободить ссылку "null" до типа значения NULL. Этот специальный unboxing не поддерживается для любого другого типа значения, поэтому, хотя Nullable является типом значения, он имеет определенные специальные линки.