簡體   English   中英

奇怪的C#編譯器行為(重載決議)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM