2013-02-18 8 views
9

in der C# 4.0 Spec Befestigungs 7.5.2.9:Ober-Bound/Lower Bound-Inferenzen und

A untere gebundene Inferenz von einem Typ U auf einen Typ V wie folgt hergestellt ist:

  • Wenn V eine der unfixierten X i , dann wird U auf die Menge der unteren Grenze zugegeben, um X i .
  • [...]

ich viele Male in diesem Abschnitt gegangen sind. 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 Befestigung ein, die unter ähnlichen Definitionsproblemen leidet.

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

+1

Ich denke nicht, dass Sie 7.5.2.9 isolieren können. Sie müssen die Gesamtheit von 7.5.2 übernehmen, um zu verstehen, was vor sich geht. –

+0

@Damien_The_Unbeliever - Das ist ein bisschen was ich fürchte. Es fühlt sich an wie ein schlecht geschriebenes Programm. Ich muss die ganze Sache verstehen, nur um mit 1 Unterabschnitt umzugehen. Ich habe 7.5.2 durchgelesen ... aber es gibt so viel zu jonglieren in meinem Kopf Xi Xj, U, V, der angenommene Generic ..... –

+0

7.5.2.9 definiert nicht wirklich, was eine unter-gebundene Schlussfolgerung * * ist **. Es ist eine Reihe von Anweisungen für das, was Sie tun sollen, wenn Sie (irgendwo in 7.5.2) eine Anweisung von z. "eine Untergrenze-Folgerung wird von U bis T gemacht". Und dann sagt Ihnen 7.5.2.11, ** wie ** diese Rückschlüsse verwendet werden. –

Antwort

5

Ich versuche mein Bestes, 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. zB:

gegeben
public static T Choose<T>(T first, T second) { 
     return (rand.Next(2) == 0)? first: second; 
    } 

ich Choose mit expliziten Typ Argumente aufrufen kann:

Choose<String>("first", "second"); 

Im Hinblick auf die Ober- oder Untergrenzen Folgerung, gibt es einige Auswirkungen im gesamten 7.5.2 die entscheiden, ob die untere oder obere Grenze der Inferenz überhaupt anwendbar ist. Zum Beispiel, 7.5.2.9 (und .10) Details, dass der Typ Parameter ist unfixiert für entweder oberen oder unteren Grenzen Inferenz auftreten. 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

IEnumerable<TResult> Select<TSource, TResult>(IEnumerable<TSource> e, 
    Func<TSource, Result> f) 

TResult „abhängig von“ TSource, weil die Art der TSource möglicherweise die Art der TResult bestimmen könnte. z.B. Bei einem Anruf wie Select(c, e->Name), TResult hängt der Typ Name in TSource.

In Bezug auf der ober und unteren Grenzen Inferenzen, für einen Parameter nicht fixierten Typs gegeben (X), dessen Typs (V) (siehe ersten Absatz), oder obere untere Grenzen des Typarguments nicht explizit deklariert (E) vom Typ U werden abgeleitet. Wenn der Typparameter kovariant ist (out Modifikator hat) und einer der Typen in der Untergrenze ein Kandidat für den Parameter ist, 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 ein unteren von Mammal gebunden schließen, weil die Typ-Parameter in IEnumerable covariant ist (zB ist es IEnumerable<out T> erklärt. Wenn es IEnumerable<in T> erklärt wurde dann eine obere Schranke geschlossen werden würde. Und wenn es erklärte Enumerabale<T> --with ohne in oder out dann wäre es invariant und weder Ober- noch Untergrenzen Folgerung gelten würde sein.)

klar, wenn Parametertyp muss weder covariant noch kontra sein kann dann genau ein Spiel auftreten

+0

Wie zur Hölle weißt du das !? –

+0

Große Erklärung Peter. –

Verwandte Themen