Почему оператор as может использоваться с Nullable <T>? - PullRequest
19 голосов
/ 18 августа 2011

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

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

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

Ответы [ 6 ]

21 голосов
/ 18 августа 2011

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

Да.

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

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

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

Вы могли бы подумать о прочтении настоящего C #спецификация, а не документация MSDN;это более определенно.

2 голосов
/ 18 августа 2011

Я прочитал:

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

И преобразования в квадраты .....

1 голос
/ 18 августа 2011

Очевидно, что документация MSDN для как оператора должна быть обновлена.

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

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

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

Обновление по ссылке в разделе "Содержимое сообщества" содержит цитаты:

The as operator must be used with a reference type or nullable type.
1 голос
/ 18 августа 2011

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

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

выражениетип ?(type) выражение: (type) null

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

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

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

1 голос
/ 18 августа 2011

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

0 голосов
/ 18 августа 2011

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

...