2015-06-01 2 views
-2

Это очень простой вопрос - преобразовать переменную типа long в тип Nullable int (int?). (см. пример ниже, а не действительный код)Невозможно неявно преобразовать тип 'long' в "int?"?

int? y = 100; 

long x = long.MaxValue; 

y = x; 

Я получаю ошибку времени компиляции.

«Не удается неявно преобразовать тип„длинный“до„межд?“. Явное преобразование существует (вы пропали без вести броска?).

У меня есть исправление (смотрите ниже раздел раствора), мое любопытство в проводке вопрос имеет 3 решения, которые один рекомендуется?

Решение

y = Convert.ToInt32(x); 
    y = (int)x; 
    y = unchecked((int) x); 

заранее спасибо за ваши предложения

+3

Вы знаете, почему компилятор жалуется на это? Он пытается вам помочь. –

+0

David - Я полностью осведомлен о потере точности (теряя значение), мой вопрос был о 3, который рекомендуется (выше всего лишь пример) –

+1

Какой из них рекомендуется, зависит от ваших требований. – phoog

ответ

3

Причина, по которой вам требуется явное преобразование в том, что не все значения long могут быть представлены как int. Компилятор более или менее говорит: «Вы можете сделать это, но вы должны сказать мне, что знаете, что делаете».

Per the docs, Convert.ToInt32 будет проверять и бросить OverflowException если long не может быть представлена ​​как int. Вы можете увидеть реализацию в reference source - это только эта проверка, а затем литье.

Вторые два варианта (как правило) одинаковы и позволяют отливку, несмотря на переполнение как uncheckedis the compiler default. Если вы измените стандартную версию компилятора на отметку using the /checked switch, вы получите OverflowException, если не в блоке unchecked.

Что касается "лучшего", это зависит от вашего требования.

+0

Вторые два варианта не совпадают. Первый будет генерировать исключение, если скомпилирован с проверкой переполнения, а второй - нет. – phoog

+0

@phoog да. Это было похоже на то, что он был стандартным и привязывался к документам, но я постараюсь сделать более ясным. –

4

int является 32-битным интегралом, а long - 64-битным интегралом.

long может хранить/представлять все int значения, но все long значения не могут быть представлены int так long больше, чем тип int, поэтому int может быть неявно преобразован в long компилятором, но не наоборот.

Так вот почему мы должны явно бросить/преобразовать long в int, которые могут привести к потере информации, если что long не представима в int

Смежные вопросы