我发现以下代码的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)
。但我不明白为什么会这样。对我来说它看起来像一个bug,但我不相信C#编译器会有这样的bug。
有什么理由吗?
附:对于具有enum参数和0值的任何方法重载(SqlDbType是枚举),这似乎是一个问题。