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:
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
?
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:
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.
Tags und Links c#