有没有办法配置VS2008 C#编译器为这样的代码发出警告:
Int64 x = 123456789000;
Int32 y = (Int32)x;
答案 0 :(得分:10)
明确演员的全部观点是说“我对这个问题负责,请你去做。”
在你无关紧要的情况下,编译器可能很容易发现该值不适合Int32,从而产生警告。
然而,这是怎么回事:
Int64 x = CallSomeMethod();
Int32 y = (Int32)x;
它怎么能警告你呢?它应该:
你可以希望这里最好的是进行运行时检查,或类似的,编译器不能阻止你出现可能出错的一切。
答案 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”复选框