この質問を読みやすく/理解できるようにする方法は正確にはわかりませんが、私の意見を聞いてください。最後に私の問題を理解していただけることを願っています (少なくとも、簡単に再現可能です)。
UnitTests で結果を検証するために使用されるメソッドを呼び出そうとします。次の署名があります。
void AssertPropertyValues<TEnumerable, TElement, TProperty>(
TEnumerable enumerable,
Func<TElement, TProperty> propertyPointer,
params TProperty[] expectedValues)
where TEnumerable : System.Collections.Generic.IList<TElement>
これが意味することは、次の入力を取るということです
- 列挙可能で、2) の入力と同じタイプのオブジェクトを含むオブジェクト。
- 1) の「内容」と同じ Type のオブジェクトを取り、3) で提供される配列の内容の Type と同じ Type のオブジェクトを返す Func (通常はラムダ式をカプセル化する)。
- 2) の Func の出力と同じ Type のオブジェクトの配列。
したがって、このメソッドの実際の実行は次のようになります。
AssertPropertyValues(
item.ItemGroups,
itemGroup => itemGroup.Name,
"Name1", "Name2", "Name3");
少なくとも、それは私がどのように見えるかを望んでいますが、よく知られているコンパイラ エラーに遭遇します:「メソッド 'X' の型引数は、使用法から推測できません。」、そしてそれは私がしていないことです。理解する。私が見る限り、必要なすべての情報が含まれているはずですか、それとも「共分散と反分散」の問題の別のバージョンでしょうか?
したがって、今のところ、代わりに次のようにする必要があります。
AssertPropertyValues(
item.ItemGroups,
(ItemGroup itemGroup) => itemGroup.Name,
"Name1", "Name2", "Name3");
このシナリオがコンパイラによって推論されない理由を誰でも指摘できますか?