簡體   English   中英

通用與非通用過載調用

[英]Generic vs Non-Generic Overload Calling

當我聲明這樣的方法時:

void DoWork<T>(T a) { }
void DoWork(int a) { }

並稱之為:

int a = 1;
DoWork(a);

它會調用什么DoWork方法?為什么? 我似乎無法在任何MSDN文檔中找到它。

正如Eric Lippert 所說

C#規范說當你在調用ReallyDoIt<string>(string)ReallyDoIt(string)之間做出選擇時 - 也就是說,當選擇兩個具有相同簽名的方法之間,但是一個通過泛型替換獲得該簽名時 - 那么我們在“替代”簽名上選擇“自然”簽名。

更新:

我們在C#規范(7.5.3)中有什么:

在不指定類型參數的情況下調用泛型方法時,類型推斷過程會嘗試推斷調用的類型參數。 通過類型推斷,類型參數int由方法的參數確定。 類型推斷作為方法調用的綁定時處理的一部分發生,並在調用的重載解析步驟before發生。

如果在方法調用中指定了特定方法組,並且未將任何類型參數指定為方法調用的一部分,則會將類型推斷應用於方法組中的每個泛型方法。 如果類型推斷成功,則推斷的類型參數用於確定后續重載解析的參數類型。 如果重載解析選擇泛型方法作為要調用的方法,則推斷的類型參數將用作調用的實際類型參數。 如果特定方法的類型推斷失敗,則該方法不參與重載解析。

所以在重載解析之前,我們在方法組中有兩個方法。 一個DoWork(int)和其他推斷的DoWork<int>(int)

我們轉到7.5.3.2(更好的功能成員):

如果參數類型序列{P1,P2,...,PN}和{Q1,Q2,...,QN}是等效的(即每個Pi具有到相應Qi的標識轉換),則應用以下打破平局規則,按順序,確定更好的功能成員。 1)如果MP是非泛型方法而MQ是通用方法,則MP優於MQ。

暫無
暫無

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

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