Компилятор C# может быть настроен для предоставления предупреждения, когда явный бросок может вызвать потерю данных?

Есть ли способ настроить компилятор VS2008 C# для предоставления предупреждения для кода как это:

Int64 x = 123456789000;
Int32 y = (Int32)x;
7
задан HBFan 25 February 2010 в 14:58
поделиться

5 ответов

Все необходимые преобразования могут привести к данным потеря. Цель приведения состоит в том, чтобы сообщить компилятору: «Я делаю здесь что-то опасное, что вы не можете проанализировать, но я знаю, что делаю». Поскольку вся цель приведения состоит в том, чтобы обработать случай, когда компилятор недостаточно умен для анализа, ожидать, что компилятор проанализирует его, чтобы выдать предупреждение, кажется бессмысленным.

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

Замечу, что неявное преобразование в некоторых редких случаях также может вызвать потерю данных. Неявные преобразования могут потерять биты точности ; что сохраняет неявное преобразование, так это величина .

5
ответ дан 6 December 2019 в 10:49
поделиться

перейдите к просмотру свойств проекта, щелкните вкладку «Сборка», нажмите кнопку «Дополнительно» в правом нижнем углу, установите флажок «Проверить наличие флажок арифметического переполнения / потери значимости "

0
ответ дан 6 December 2019 в 10:49
поделиться

Компилятор не может сделать это во время компиляции, но вы можете настроить его для выдачи исключений во время выполнения,

В свойствах проекта-> Сборка-> Дополнительно-> Проверить переполнение \ underflow

{{ 1}}
2
ответ дан 6 December 2019 в 10:49
поделиться

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

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

Однако как насчет этого:

Int64 x = CallSomeMethod();
Int32 y = (Int32)x;

Как он может вас об этом предупредить? Должен ли он:

  1. попытаться выяснить, какой диапазон может возвращать значение из CallSomeMethod? Всегда предупреждать
  2. ? (тогда в чем будет смысл?)

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

10
ответ дан 6 December 2019 в 10:49
поделиться

Я согласен с явным объяснением Лассе В. Карлсена приведения в соответствие.

Одним из возможных решений для вас в этом случае является фактическое удаление явных приведений (поиск и замена их) в вашем коде, если вы действительно хотите получать «предупреждения», когда существует подобное приведение. Это будет означать, что вам придется вручную просмотреть все произошедшие приведения (в списке предупреждений) и определить, действительны они или нет. поэтому ваш код будет выглядеть так:

Int64 x = 123456789000;
Int32 y = x;
1
ответ дан 6 December 2019 в 10:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: