10

C# 4.0 仕様 7.5.2.9 では:

型 U から型 V への下限の推論は、次のように行われます

  • V が固定されていない X iの 1 つである場合、U が X iの下限のセットに追加されます。
  • [...]

私はこのセクションを何度も読み返してきました。セクション参照がないため、この定義は循環参照のように見えます。だから、私は明確にするために近くで文法の生産またはセクションの参照を見つけることを期待しています..私はそうではありません. このセクションは、同様の定義の問題に悩まされている Fixingにも関係しています。

とは何upper-bound inferenceですかlower-bound inference

4

1 に答える 1

5

もっとわかりやすく説明できるように頑張ります。最悪の場合、私はそれをの方法で説明します。

上位/下位の推論は、特定のジェネリック メソッド呼び出しに使用される型引数に関する型推論への段階的なアプローチの一部です。明らかに、最初のフェーズで引数 (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のタイプに依存します。TSourceTResultSelect(c, e->Name)TResultNameTSource

上限および下限の推論に関して、型 (V) が明示的に宣言されていない特定の固定されていない型パラメーター (X) について (最初の段落を参照)、型 U の型引数 (E) の上限または下限が推定されます。 . 型パラメーターが共変 (out修飾子を持つ) であり、下限セット内の型の 1 つがパラメーターの候補である場合、下限推論が発生しました。逆に、型パラメーターが反変 ('in' 修飾子を持つ) であり、上限セット内の型の 1 つがパラメーターの候補である場合、上限推論が発生しました。たとえば withSelect(c, e->e.Name)cwasIEnumerable<Mammal>の場合、コンパイラは の下限Mammalを推測します。これは、 in の型パラメーターが共変であるためIEnumerableです (たとえば、IEnumerable<out T>. 宣言されている場合IEnumerable<in T>、上限が推測されます。また、それが --noまたはthenEnumerabale<T>なしで宣言された場合、それは不変であり、上限または下限の推論は適用されません。)inout

明らかに、パラメーターの型が共変でも反変でもない場合は、完全に一致する必要があります

于 2013-02-18T22:34:35.023 に答える