次のコードで非常に奇妙なC#コンパイラの動作を見つけました:
var p1 = new SqlParameter("@p", Convert.ToInt32(1));
var p2 = new SqlParameter("@p", 1);
Assert.AreEqual(p1.Value, p2.Value); // PASS
var x = 0;
p1 = new SqlParameter("@p", Convert.ToInt32(x));
p2 = new SqlParameter("@p", x);
Assert.AreEqual(p1.Value, p2.Value); // PASS
p1 = new SqlParameter("@p", Convert.ToInt32(0));
p2 = new SqlParameter("@p", 0);
Assert.AreEqual(p1.Value, p2.Value); // FAIL!?
最後の行で、assertは次のメッセージで失敗します。
Expected: 0
But was: null
テストが失敗する理由を理解しています。他の場合はとしてp2 = new SqlParameter("@p", 0);
解決されます。しかし、なぜこれが起こるのかわかりません。私にはバグのように見えますが、C#コンパイラにそのようなバグがあるとは信じられません。SqlParameter(string, SqlDbType)
SqlParameter(string, object)
これには何か理由がありますか?
PS enumパラメーターと0の値(SqlDbTypeはenum)を使用したメソッドのオーバーロードでは、問題があるようです。