Upper-Bound / Lower-Bound Rückschlüsse und Korrekturen

9

In der C # 4.0-Spezifikation 7.5.2.9:

  

Ein Untergrenzen-Inferenz von einem Typ U zu einem Typ V wird als gemacht   folgt:

  • Wenn V eines der nicht fixierten X i
  • [...]

Ich bin diesen Abschnitt schon oft durchgegangen. Da eine Abschnittsreferenz fehlt, liest sich diese Definition wie eine Zirkelreferenz. Also, ich erwarte, dass ich in der Nähe eine Grammophonproduktion oder eine Abschnittsreferenz finde, um zu klären, was ich nicht tue. Dieser Abschnitt bindet auch Fixing ein, das unter ähnlichen Definitionsproblemen leidet.

Was ist ein upper-bound inference gegen ein lower-bound inference ?

    
P.Brian.Mackey 18.02.2013, 14:14
quelle

1 Antwort

5

Ich werde mein Bestes versuchen, um es klarer zu beschreiben. Worst Case, ich beschreibe es anders .

Die obere / untere Inferenz ist ein Teil eines phasengesteuerten Ansatzes zur Typinferenz in Bezug auf Typargumente, die für einen bestimmten generischen Methodenaufruf verwendet werden. Offensichtlich wird die obere / untere Inferenz nicht angewendet, wenn in der ersten Phase das Argument (E) explizit eingegeben wird. z.B.:

gegeben

%Vor%

Ich kann Choose mit expliziten Typargumenten aufrufen:

%Vor%

In Bezug auf die Ober- oder Untergrenzenannullierung gibt es einige Implikationen in 7.5.2, die entscheiden, ob die Inferenz für die untere oder obere Grenze überhaupt anwendbar ist. Zum Beispiel präzisieren 7.5.2.9 (und .10), dass der Typparameter unfixed ist, damit entweder die Ober- oder die Untergrenze auftre- ten kann. 7.5.2.5 Details, dass ein Typparameter nur dann unfixiert ist, wenn dieser Typparameter von einem anderen nicht fixierten Typparameter abhängt. Zum Beispiel

%Vor%

TResult "hängt von" TSource ab, weil der Typ von TSource möglicherweise den Typ von TResult bestimmen kann. z.B. mit einem Aufruf wie Select(c, e->Name) , TResult hängt vom Typ von Name in TSource ab.

In Bezug auf die Ober- und Untergrenzen-Inferenz wird für einen gegebenen unfixierten Typparameter (X), dessen Typ (V) nicht explizit deklariert ist (siehe erster Absatz), die obere oder untere Grenze von Typargument (E) vom Typ U wird abgeleitet. Wenn der Typparameter kovariant ist (hat out modifier) ​​und einer der Typen in der Untergrenze ein Kandidat für den Parameter ist, dann ist eine Untergrenze aufgetreten. Umgekehrt, wenn der Typparameter kontravariant ist (hat 'in' Modifikator) und einer der Typen in der Obergrenzenmenge ein Kandidat für den Parameter ist, dann ist eine Obergrenzen-Inferenz aufgetreten. z.B. mit Select(c, e->e.Name) und c war IEnumerable<Mammal> dann würde der Compiler eine untere Grenze von Mammal ableiten, weil der Typparameter in IEnumerable kovariant ist (zB deklariert IEnumerable<out T> . If Wurde IEnumerable<in T> deklariert, dann würde eine Obergrenze abgeleitet werden, und wenn Enumerabale<T> deklariert würde - ohne in oder out , dann wäre es invariant und weder es würde auch keine Untergrenzen-Inferenz zutreffen.)

Wenn der Parametertyp weder kovariant noch kontravariant sein kann, muss eine exakte Übereinstimmung gefunden werden.

    
Peter Ritchie 18.02.2013, 22:34
quelle

Tags und Links