Я обнаружил очень странное поведение компилятора С# для следующего кода:
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. Кажется, это проблема для любой перегрузки метода с параметром перечисления и значением 0 (SqlDbType — это перечисление).