Почему это неявное преобразование из int в uint работает? - PullRequest
13 голосов
/ 25 января 2012

Использование Приведение к нулю не компилирует как вдохновение, и из комментария Эрика Липперта:

Это демонстрирует интересный случай."uint x = (int) 0;"будет успешным, даже если int не является неявно конвертируемым в uint.

Мы знаем, что это не работает, потому что object нельзя присвоить string:

string x = (object)null;

Но это так, хотя интуитивно и не должно:

uint x = (int)0;

Почему разрешает компилятору разрешать этот случай, когда int неявно не преобразуется в uint?

Ответы [ 3 ]

26 голосов
/ 25 января 2012

Преобразование целочисленных констант рассматривается языком C # как особый;здесь раздел 6.1.9 спецификации:

Константное выражение типа int может быть преобразовано в тип sbyte, byte, short, ushort, uint или ulong, при условии значения константы-выражениянаходится в пределах диапазона типа назначения.Постоянное выражение типа long может быть преобразовано в тип ulong при условии, что значение константного выражения не является отрицательным.

Это позволяет вам выполнять такие действия, как:

byte x = 64;

что в противном случае потребовало бы уродливого явного преобразования:

byte x = (byte)64; // gross
9 голосов
/ 25 января 2012

Следующий код завершится ошибкой с сообщением «Не удалось неявно преобразовать тип int в uint. Существует явное преобразование (вы пропустили приведение?)»

int y = 0;
uint x = (int)y;

И это не удастся с: «Постоянное значение« -1 »не может быть преобразовано в« uint »»

uint x = (int)-1;

Таким образом, единственная причина, по которой работает uint x = (int)0;, заключается в том, что компилятор видит, что 0 (или любое другое значение> 0) является постоянной времени компиляции, которую можно преобразовать в uint

2 голосов
/ 26 января 2012

Обычно компиляторы имеют 4 шага, в которые преобразуется код.Текст разбит на токены> Токены разбираются> AST создается + связывается> AST преобразуется в целевой язык.

Оценка констант, таких как числа и строки, выполняется в качестве первого шага, и компилятор, вероятно, обрабатывает 0как действительный токен и игнорирует приведение.

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