私は、コードを次のように非常に奇妙なC#コンパイラの挙動を見つけた:最後の行のアサートで奇妙な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!?
は、次のメッセージで失敗します。
Expected: 0
But was: null
私は理由を理解しますテストが失敗する:p2 = new SqlParameter("@p", 0);
はSqlParameter(string, SqlDbType)
と解決され、その他の場合はSqlParameter(string, object)
と解決されます。しかし、なぜこれが起こるのか分かりません。私にとってはバグのように見えますが、C#コンパイラがこの種のバグを持つことは信じられません。
これには何らかの理由がありますか?
P.S.これは、enumパラメータと0値(SqlDbTypeはenum)を使用したメソッドオーバーロードの問題であると思われます。
ジャストアイデアは、何が起こりますか?たぶんそれはこの場合警告するでしょう。 – dowhilefor
イェップ、私はそれを持っている。私の質問は:それはなぜ0のためだけに働くのですか? –
@VictorHaydinは、仕様がそうだと言っているからです... "暗黙的な列挙変換により、10進整数 - リテラル0は列挙型に変換され、根底にある型は列挙型になります。"さて、なぜこのように設計されたのか分かりませんが、おそらく良い理由があります。あなたはC#チームの誰かに尋ねる必要があります。 –