为隐式转换启用编译器警告(C#)

时间:2015-04-10 00:46:01

标签: c# compiler-warnings implicit-conversion

有没有办法在C#中为隐式转换启用编译器警告?

最近调试了一个多小时,直到我意识到我有以下代码:

double = int / int;

并没有按预期工作。即使在警告级别4,编译器也不会显示任何警告。我正在使用Microsoft Visual Studio 2013.

3 个答案:

答案 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中的代码分析工具也不会引起人们的注意。