Почему int я = 10; i/0; компилируется, но 5/0 дает CS0020 - деление на постоянный ноль?

Рассмотрим следующий фрагмент:

int i = 5 / 0;

Это дает ошибку компилятора CS0020: деление на постоянный ноль, что нормально. Тем не менее, следующий фрагмент:

int i = 10;
i = i / 0;

Компилирует просто отлично.

Кто-то знает почему? Я не вижу причин, почему компилятор позволяет целочисленной переменной делиться на нулевую целочисленную константу.

Ответ 1

В общем случае у компилятора нет причин запрещать деление на ноль (или любое другое число) во время выполнения.

Тем не менее, ваш первый пример - это постоянная времени компиляции, то есть она вычисляется компилятором и заменяется результатом оценки. Это то, на что жалуется компилятор, так как он по праву не знает, какое целочисленное значение вместо 5/0.

Ответ 2

Это просто разница между проверкой времени компиляции и проверкой времени выполнения. В то время как

i = i / 0;

бросает

System.DivideByZeroException: 'Попытка деления на ноль.'

i = 5 / 0;

выдает ошибку компиляции

Ошибка CS0020 Деление на постоянный ноль.

Значение 5/0 оценивается во время компиляции, вот что делает разницу между получением ошибки и получением исключения.

РЕДАКТИРОВАТЬ:

Учитывая комментарии к ответам здесь, я потрачу некоторое время, чтобы написать предположение о том, почему компилятор работает таким образом. Компилятор никогда не предназначался для предотвращения деления на ноль переменной. Если вы хотите сделать это, вам разрешено, и вы могли бы работать хитрым способом, чтобы ваша программа делилась на ноль. То, что должен был сделать компилятор, - это просто сделать некоторую оптимизацию, когда это возможно, вычисляя, что он продвигает некоторое исчисление и заменяет их полученным значением. Когда он видит деление на ноль, он просто выдает ошибку, поскольку не может его вычислить.

Ответ 3

Из-за того, что компилятор конвертирует int я = 5/0; к постоянному значению, поэтому он должен вычислить значение во время компиляции, что дает ему ошибку.

Но код

int i = 10;
i = i / 0;

формально правильно. Он создает исключение, и это ваше решение и ваше намерение создать такое исключение.

Ответ 4

так же, как все говорят здесь. Эта строка здесь время компиляции, и так как компилятор не знает ответ на этот вопрос. Это дает ошибку

int i = 5 / 0;

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

 int i = 10;
 i = i / 0;