Почему компилятор жалуется, когда переменная находится в диапазоне длинного типа данных

У меня есть следующее объявление в моем классе.

public class MyClass
{
    private const long SOME_VALUE= (10 * 1024 * 1024 * 1024);  // 10 GB
    ....
}

Однако компилятор сообщает о следующей ошибке

ошибка CS0220: операция переполняется во время компиляции в проверенном режиме

Согласно MSDN.

введите здесь описание изображения

Насколько я могу судить, SOME_VALUE находится в этом диапазоне для типа long. Любые мысли о том, почему я получаю эту ошибку времени компиляции?


person jim crown    schedule 26.02.2017    source источник


Ответы (2)


Каждое из отдельных значений в вычислении равно int, поэтому компилятор умножает их вместе как ints, отсюда и переполнение. Самое простое решение — пометить один или все из них как long с помощью L suffix, это заставит вычисление выполняться как long:

private const long SOME_VALUE= 10L * 1024 * 1024 * 1024;
person DavidG    schedule 26.02.2017

Добавьте суффикс L:

public class MyClass
{
    private const long SOME_VALUE= (10L * 1024L * 1024L * 1024L);  // 10 GB
    ....
}

Без суффикса L (расшифровывается как long) компилятор трактует выражение как int единицу и предупреждает о целочисленном переполнении.

person Dmitry Bychenko    schedule 26.02.2017