もっとわかりやすく説明できるように頑張ります。最悪の場合、私はそれを別の方法で説明します。
上位/下位の推論は、特定のジェネリック メソッド呼び出しに使用される型引数に関する型推論への段階的なアプローチの一部です。明らかに、最初のフェーズで引数 (E) が明示的に型指定されている場合、上位/下位の推論は適用されません。例えば:
与えられた
public static T Choose<T>(T first, T second) {
return (rand.Next(2) == 0)? first: second;
}
Choose
明示的な型引数で呼び出すことができます:
Choose<String>("first", "second");
上限または下限の推論に関しては、7.5.2 全体で、下限または上限の推論が適用可能かどうかを決定するいくつかの意味があります。たとえば、7.5.2.9 (および .10) では、上限または下限の推論が発生するために型パラメーターが固定されていないことが詳述されています。7.5.2.5 は、その型パラメーターが別の固定されていない型パラメーターに依存している場合にのみ、その型パラメーターが固定されていないことを詳述しています。例えば
IEnumerable<TResult> Select<TSource, TResult>(IEnumerable<TSource> e,
Func<TSource, Result> f)
TResult
の型が の型を決定する可能性があるTSource
ため、「に依存」します。たとえば、のような呼び出しでは、 inのタイプに依存します。TSource
TResult
Select(c, e->Name)
TResult
Name
TSource
上限および下限の推論に関して、型 (V) が明示的に宣言されていない特定の固定されていない型パラメーター (X) について (最初の段落を参照)、型 U の型引数 (E) の上限または下限が推定されます。 . 型パラメーターが共変 (out
修飾子を持つ) であり、下限セット内の型の 1 つがパラメーターの候補である場合、下限推論が発生しました。逆に、型パラメーターが反変 ('in' 修飾子を持つ) であり、上限セット内の型の 1 つがパラメーターの候補である場合、上限推論が発生しました。たとえば withSelect(c, e->e.Name)
とc
wasIEnumerable<Mammal>
の場合、コンパイラは の下限Mammal
を推測します。これは、 in の型パラメーターが共変であるためIEnumerable
です (たとえば、IEnumerable<out T>
. 宣言されている場合IEnumerable<in T>
、上限が推測されます。また、それが --noまたはthenEnumerabale<T>
なしで宣言された場合、それは不変であり、上限または下限の推論は適用されません。)in
out
明らかに、パラメーターの型が共変でも反変でもない場合は、完全に一致する必要があります