Я нашел очень странное поведение компилятора С# для следующего кода:
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);
разрешен как SqlParameter(string, SqlDbType)
, а для других случаев - SqlParameter(string, object)
. Но я не понимаю, почему это происходит. Для меня это похоже на ошибку, но я не могу поверить, что компилятор С# может иметь такую ошибку.
Любые причины для этого?
P.S. Кажется, проблема для любой перегрузки метода с параметром enum и значением 0 (SqlDbType - перечисление).