簡體   English   中英

為什么選擇泛型函數成員而不是非泛型函數?

[英]Why is a generic function member chosen over a non-generic one?

public enum EnumTest
{
    EnumEntry
}

public class TestClass
{
    public string FunctionMember(string s, EnumTest t = EnumTest.EnumEntry)
    {
        return "Normal";
    }

    public string FunctionMember<T>(T t)
    {
        return "Generic";
    }
}

class Program
{
    static void Main(string[] args)
    {
        TestClass t = new TestClass();

        Console.WriteLine(t.FunctionMember("a"));
    }
}

這打印“通用”。 刪除, EnumTest t = EnumTest.EnumEntry使其打印為“正常”。

然而標准似乎很清楚,從14.4.2.2更好的功能成員應用的第一個鑒別器是:

  • 如果MP和MQ中的一個是非泛型的,但另一個是通用的,那么非泛型更好。

我錯過了什么或編譯錯誤?

你錯過了什么。 這是以下內容:

您使用一個參數調用該方法。 只有一種方法有一個參數,即通用參數。 這就是所選擇的那個。

只有在找不到匹配方法時,才會查看帶有可選參數的其他方法。

參考文獻:

  1. C#4.0規范 ,21.4中的最后一段:

    作為一個平局規則,一個函數成員,其中顯式給出的所有參數都優於提供默認值的一個參數,而不是顯式參數。

  2. MSDN ,標題為“重載分辨率”,最后一個要點:

    如果判斷兩個候選者同樣好,則優先選擇沒有可選參數的候選者,該參數在調用中被省略。 這是對具有較少參數的候選者的重載分辨率的一般偏好的結果。

  3. C#語言規范 ,章節“7.5.3.2更好的功能成員”:

    每個候選函數成員的參數列表按以下方式構造:

    • 如果函數成員僅適用於擴展形式,則使用擴展形式。
    • 從參數列表中刪除沒有相應參數的可選參數

    它繼續這樣:

    給定一個參數列表A,其中包含一組參數表達式{E 1 ,E 2 ,...,E N }和兩個適用的函數成員MP和MQ,參數類型為{P 1 ,P 2 ,...,P N }和{Q 1 ,Q 2 ,...,Q N } [...]

    此時,帶有可選參數的方法已經不在游戲中。 N是1,但該方法有兩個參數。

文檔說:

如果判斷兩個候選者同樣好,則優先選擇沒有可選參數的候選者,該參數在調用中被省略。 這是對具有較少參數的候選者的重載分辨率的一般偏好的結果。

換句話說,沒有任何可選參數的方法將是首選。

使用方法參數的默認值,可以擴展重載決策。

從概念上講,將運行v4之前的方法重載分辨率。 如果找到匹配的匹配項將被使用。 (從概念上講,因為這不是對它如何工作的描述,而是你如何看待它)

在您的情況下,它只找到一個匹配作為您的通用方法

如果找不到匹配項,它將查找具有部分匹配的方法以及可以使用默認值完成匹配的方法。 在你的情況下,你可以在這次運行中找到無通用的方法,但由於已經找到匹配,因此分辨率永遠不會出現。

刪除第二個參數時,最終會出現通用和非通用匹配的情況。 你挑選非一般性的規則。

總而言之,一個好的經驗法則是選擇最具體的可用方法。

匹配的非泛型方法比泛型更具體,因為類型不能改變。 如果兩個方法可用但是一個接受IFoo參數而另一個接受Foo(實現IFoo),則默認參數的方法不如參數計數與參數計數匹配的方法(數字是完全匹配)的特定方法在將Foo對象作為參數傳遞時將選擇后者,因為它是完全匹配的。 更加具體

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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