2 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
類型推斷不會(huì)從泛型方法調(diào)用中推斷出缺少的參數(shù)。相反,它要么推斷所有參數(shù),要么不推斷任何參數(shù)。因此,您不能使用一種類型參數(shù)調(diào)用該方法,并期望編譯器給出其余的參數(shù)。
在這種情況下,可以推斷TItemType
,因?yàn)樗挥趨?shù)之一中。TListType
但無法推斷,因?yàn)樗欠祷仡愋?。因此最終無法推斷方法簽名,并且您必須指定所有類型參數(shù)。

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊
正如其他人所說,C# 不支持部分泛型類型參數(shù)推斷。
關(guān)于為什么無法推斷其中一種類型,也許一個(gè)更明顯的例子可以更清楚地說明這一點(diǎn):
TPeeledFruit peeled = Peel<TPeeledFruit, TFruit)( this TFruit fruit) where TPeeledFruit: TFruit
好吧,現(xiàn)在你說:
var myPeeledBanana = Peel(myBanana)
編譯器很容易推斷出一定TFruit
是Banana
。
但它如何推斷出實(shí)際情況呢TPeeledFruit
?它沒有任何此類信息;您可能會(huì)認(rèn)為這是顯而易見的,因?yàn)槟私馄渲械年P(guān)系,但編譯器沒有這樣的知識(shí)。它唯一知道的是,它TPeeledFruit
必須是一個(gè)繼承自的類型TFruit
,但可以是無限數(shù)量的類型:它可以Banana
再次,它可以是PeeledBanana
,它可以是PeeledRipeBanana
,PeeledGreenBanana
等等。
還要考慮這樣一個(gè)事實(shí):顯式鍵入賦值沒有任何幫助:
PeeledBanana myPeeledBanana = Peel(myBanana)
這也行不通,C# 首先推理賦值右側(cè)的類型,然后計(jì)算賦值是否實(shí)際上合法。如果它是隱式類型變量,則賦值始終有效。
- 2 回答
- 0 關(guān)注
- 147 瀏覽
添加回答
舉報(bào)