簡體   English   中英

具有類型推斷的泛型和非泛型方法重載規則

[英]Generic and non-generic method overload rules with type inference

給定以下兩個重載的方法簽名:

public B DoSomething<A,B>(A objOne, B objTwo)
public object DoSomething(object objOne, Type objType);

我希望調用此方法將調用第二個簽名,但它不會:

var obj = new SomeType();
var type = typeof(SomeOtherType);

DoSomething(obj, type);

在我看來,從規格上看,第二個重載更為適用(具有一個確切的類型,並且不那么精打細算)。 但是,它不會被調用。 而是使用A作為類型object和B作為Type來調用第一個重載。 為什么會這樣,除了重命名方法或使用命名參數之外,還有一種方法可以調用此方法?

編輯:

以下是我在7.5.3.2中引用的規范部分:

如果參數類型序列{P1,P2,…,PN}和{Q1,Q2,…,QN}是等效的(即每個Pi具有到對應Qi的標識轉換),則應用以下打破平局的規則,為了確定更好的功能成員。

  • 如果MP是非泛型方法,而MQ是泛型方法,則MP優於MQ。
  • ...
  • 否則,如果MP具有比MQ更具體的參數類型,則MP優於MQ。 令{R1,R2,…,RN}和{S1,S2,…,SN}代表MP和MQ的未實例化和未擴展的參數類型。 如果對於每個參數,RX的特定性不小於對SX的特定性,則MP的參數類型比對MQ的特定性更強;對於至少一個參數,對RX而言,其不比SX更特定:
    • 類型參數不如非類型參數具體。
    • ...

編輯后,這里是供編譯器選擇的方法

DoSomething<SomeType,Type>(SomeType o, Type t)
DoSomething(object o,Type t);

如規范所述,關於挑選更好的功能成員:

給定一個帶有一組參數表達式{E1,E2,...,EN}的參數列表A以及兩個適用的函數成員MP和MQ,它們的參數類型為{P1,P2,...,PN}和{Q1,Q2, ...,QN},如果滿足以下條件,則MP被定義為比MQ 更好的函數成員
•對於至少一個參數,從EX到PX的轉換要好於從EX到QX的轉換。

泛型方法從SomeTypeSomeType轉換要比非泛型方法從SomeTypeobject轉換SomeType 如果將非泛型方法定義為

DoSomething(SomeType o, Type t);

那么將沒有任何參數具有更好的轉換,並且您會陷入困境:

如果參數類型序列{P1,P2,…,PN}和{Q1,Q2,…,QN}是等效的

第一條規則將采用非通用方法的地方:

•如果MP是非泛型方法,而MQ是泛型方法,則MP優於MQ。


注意:在編輯問題之前,存在類型為object第一個參數,而通用方法為

DoSomething<object,Type>(object o, Type t)

同樣,在這種情況下,參數序列是等效的,並且選擇了非泛型方法。

在測試中,我能夠使用強制轉換來獲得所需的分辨率。 DoSomething((object)"1234", typeof(string));

調用DoSomething<object, SomeType>(obj, type)();

暫無
暫無

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

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