[英]Strange C# compiler behavior when choosing overload that looks like a bug/missing feature
[英]Strange C# compiler behavior (overload resolution)
我發現以下代碼的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, SqlDbType)
SqlParameter(string, object)
。 但我不明白為什么會這樣。 對我來說它看起來像一個bug,但我不相信C#編譯器會有這樣的bug。
有什么理由嗎?
PS對於任何帶有enum參數和0值的方法重載(SqlDbType是枚舉)似乎是一個問題。
基本上,十進制整數文字0
可以隱式轉換為所有枚舉類型(C#4規范§6.1.3),因此編譯器確定SqlParameter(string, SqlDbType)
是適用的函數成員。 然后它必須在兩個候選函數成員之間選擇更好,並且它通過SqlParameter(string, object)
選擇SqlParameter(string, SqlDbType)
SqlParameter(string, object)
,因為SqlDbType
是比object
更具體的類型(第7.5.3.2節)。
但我同意在那種情況下它很混亂......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.