给定以下 C# 代码,
double x = 2.0;
x *= 0.5;
bool y = (x == 1.0);
Console.WriteLine(y);
CodeContracts 给出警告:Possible precision mismatch for the arguments of ==
.
如果我将代码更改为以下任何一种:
double x = 2.0 * 0.5;
bool y = (x == 1.0);
Console.WriteLine(y);
或者
double x = 2.0 * 0.5;
bool y;
if (x == 1.0) {
y = true;
} else {
y = false;
}
Console.WriteLine(y);
或者,也许是最令人困惑的
double x = 2.0;
x *= 0.5;
bool y = ((double)x == 1.0);
Console.WriteLine(y);
它没有给我任何警告。是什么让第一个案例与其他案例不同,它值得警告?
更新
这只是产生此警告的另一个示例,这次是作为除法运算符的警卫:
Contract.Requires<ArgumentOutOfRangeException>(rhs != 0.0);