有没有办法在C#中为隐式转换启用编译器警告?
最近调试了一个多小时,直到我意识到我有以下代码:
double = int / int;
并没有按预期工作。即使在警告级别4,编译器也不会显示任何警告。我正在使用Microsoft Visual Studio 2013.
答案 0 :(得分:2)
这个“问题”更像是一个启发式问题。
实际上您的代码正在执行以下操作。
int numerator = ...;
int denominator = ...;
int integerDivide = numerator / denominator;
double result = integerDivide;
在任何时候,编译器都不应将任何标记为错误。当然你可以把整个视为一个警告,但它不符合编译器的工作精神。
可以将此作为警告添加到某种生产力工具上,例如Resharper或Roslyn。但它永远不会被添加到核心编译器。
答案 1 :(得分:1)
C#已经警告过一些荒谬的安全转换,但正如其他人所观察到的,看起来你确实在寻找自动检测整数(截断)除法。不幸的是,它与MSIL中的DIV
操作码相同,因此需要进行类型分析才能检测到它。不是不可能,而是非平凡的。
答案 2 :(得分:0)
我认为这是因为将int的值赋值给double不需要转换。如果您尝试相反的方法:
double a = 5;
int b = a;
你得到一个“无法隐式地将double转换为int”错误。但如果你试试你正在做的事情:
int a = 5;
double b = a;
一切正常。
double具有比int更高的最大值(并且可能更低的最小值),因此不需要转换,因此您不应该遇到分配double和int的任何副作用,因此不需要出错。我注意到,即使启用了最严格的规则集,vs2013中的代码分析工具也不会引起人们的注意。