可以将C#编译器配置为在显式转换可能导致数据丢失时发出警告吗?

时间:2010-02-25 14:58:34

标签: c# casting compiler-warnings

有没有办法配置VS2008 C#编译器为这样的代码发出警告:

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

5 个答案:

答案 0 :(得分:10)

明确演员的全部观点是说“我对这个问题负责,请你去做。”

在你无关紧要的情况下,编译器可能很容易发现该值不适合Int32,从而产生警告。

然而,这是怎么回事:

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

它怎么能警告你呢?它应该:

  1. 试图找出CallSomeMethod可以返回的值的范围是什么类型?
  2. 总是警告? (那么重点是什么?)
  3. 你可以希望这里最好的是进行运行时检查,或类似的,编译器不能阻止你出现可能出错的一切。

答案 1 :(得分:5)

所有必要的强制转换可能会导致数据丢失。演员的目的是告诉编译器“我在这里做了一些你无法分析的危险,但我知道我在做什么”。由于演员的整个目的是处理编译器不够智能分析的情况,期望编译器分析它以给出警告似乎毫无意义。

因此,您的提案实际上是对每个必要的演员发出警告,这似乎适得其反。

我注意到隐式转换在某些极少数情况下也会导致数据丢失。隐式转换可能会丢失 precision ;隐式转换保留的是幅度

答案 2 :(得分:2)

编译器无法在编译时执行此操作,但您可以将其配置为在运行时抛出exeptions,

在项目属性 - >构建 - >高级 - >检查溢出\下溢

答案 3 :(得分:1)

我同意Lasse V. Karlsen's明确的演员解释。

在这种情况下,对于您来说,一个可能的解决方案是在您的代码中实际删除显式强制转换(查找并替换它们),如果您真的希望在这样的强制转换时出现“警告” exists.It意味着您必须手动完成所有发生的演员表(在警告列表中)并确定它们是否有效。所以你的代码看起来像这样:

Int64 x = 123456789000;
Int32 y = x;

答案 4 :(得分:0)

转到项目的属性视图,单击Build选项卡,单击右下方的Advanced按钮,选中“Check for arithmetic overflow / underflow”复选框