我不完全確定如何使這個問題可讀/可理解,但聽到我的出來,我希望你能理解我的問題,當我們到最後(至少,它很容易再現)。爲什麼方法類型推斷無法推斷出類型參數?
我嘗試調用一個方法來驗證UnitTests中的結果。它具有以下特徵:
void AssertPropertyValues<TEnumerable, TElement, TProperty>(
TEnumerable enumerable,
Func<TElement, TProperty> propertyPointer,
params TProperty[] expectedValues)
where TEnumerable : System.Collections.Generic.IList<TElement>
這意味着,它需要以下輸入
- 任何對象,它是枚舉,幷包含相同類型intput 2)的對象。
- 一個Func(通常是封裝lambda表達式),它接受與1)的「contents」類型相同的對象,並返回與3)中提供的數組內容類型相同的Type對象。
- 與2)中Func的輸出相同類型的對象的數組。
因此,這種方法的實際執行可能看起來像這樣:
AssertPropertyValues(
item.ItemGroups,
itemGroup => itemGroup.Name,
"Name1", "Name2", "Name3");
至少,這是我想它的樣子,但我碰上了衆所周知的編譯器錯誤: 「方法'X'的類型參數不能從用法推斷出來。」,這是我不明白的。它應該有我所能看到的所有信息,或者它是「協方差和逆變」問題的另一個版本?
所以現在我不得不做這樣的代替:
AssertPropertyValues(
item.ItemGroups,
(ItemGroup itemGroup) => itemGroup.Name,
"Name1", "Name2", "Name3");
任何人都可以指出爲什麼這種情況下不能由編譯器推斷?
您是否嘗試過使用'IEnumerable'或者......而不是'TEnumerable'?基本上''propertyPointer''參數應該與謂詞相同,例如在'Enumerable.Select'擴展方法中(因此整個構造工作都一樣)...... item.ItemGroups具有哪種類型(任何錯配,這使得明確的簽名是強制性的?)?否則我不會遇到你正面臨的問題... –
我已經修復了代碼示例的格式,以便它們合理並重新命名爲你的問題;這與lambda無關。 –
@AndreasNiedermair我的問題源於我最初有這個約束多個地方,並在一些地方使用它們作爲返回類型,因此不能只用接口「做」。在嘗試EricLippert的解決方案時不再是這種情況。 –