次の 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);