Почему 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;