Может ли компилятор C # быть настроен на выдачу предупреждения, когда явное приведение может привести к потере данных? - PullRequest
7 голосов
/ 25 февраля 2010

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

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

Ответы [ 5 ]

10 голосов
/ 25 февраля 2010

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

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

Однако, что по этому поводу:

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

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

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

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

5 голосов
/ 25 февраля 2010

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

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

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

2 голосов
/ 25 февраля 2010

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

В свойствах проекта-> Build-> Advanced-> Check overflow \ underflow

1 голос
/ 25 февраля 2010

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

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

Int64 x = 123456789000;
Int32 y = x;
0 голосов
/ 25 февраля 2010

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

...