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

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

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

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

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

但是,这个怎么样:

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

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

  1. 试着找出CallSomeMethod可以返回的值的范围是什么?
  2. 总是警告? (那么关键是什么?)

你可以期待的最好的是进行运行时检查,或类似的,编译器不能阻止你从可能出错的一切。

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

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

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

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

在项目属性 – >构建 – >高级 – >检查overflow \ underflow

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

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

 Int64 x = 123456789000; Int32 y = x; 

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