2013-02-18 15 views
9

w pozycji C# 4.0 Spec 7.5.2.9:Górne ograniczenie/Dolna związanego nagromadzeniem i mocowania

niższy związana wnioskowanie od typu U do litery V jest wykonany jako następujący:

  • Jeśli V jest jednym z utrwalonego X i, wówczas U dodany do zestawu dolnych granic dla X i.
  • [...]

Poszedłem nad tym rozdziale wiele razy. Brak odniesienia do sekcji, ta definicja brzmi jak odniesienie kołowe. Spodziewam się więc, że w pobliżu znajdzie się produkcja gramatyki lub odnośnik do sekcji, aby wyjaśnić ... czego nie mam. Ta sekcja również wiąże się z Naprawianiem, który cierpi na podobne problemy z definicją.

Co to jest upper-bound inference kontra lower-bound inference?

+1

Nie sądzę, że można wziąć 7.5.2.9 w izolacji. Aby zrozumieć, co się dzieje, musisz wziąć w całości udział w 7.5.2. –

+0

@Damien_The_Unbeliever - To miłe - to, czego się boję. Wydaje się, że to źle napisany program. Muszę zrozumieć całość, aby poradzić sobie z 1 podrozdziałem. Przeczytałem 7.5.2 ... ale jest tak wiele do żonglowania w mojej głowie Xi Xj, U, V, zakładana Generic ..... –

+0

7.5.2.9 tak naprawdę nie definiuje, co to jest niższa konkluzja * *jest**. Jest to zestaw instrukcji dotyczących tego, co masz zamiar zrobić, gdy znajdziesz (gdziekolwiek w 7.5.2) instrukcję np. "wnioskowanie o niższej granicy składa się z U do T". A następnie 7.5.2.11 mówi ci ** jak ** te inferencje są używane. –

Odpowiedz

5

Postaram się jak najlepiej opisać to jaśniej. Najgorszy przypadek, ja opisuję to inaczej.

Wnioskowanie górna/dolna jest jedną z części stopniowego podejścia do wnioskowania typu w odniesieniu do argumentów typu, które są używane do określonego ogólnego wywołania metody. Oczywiście wnioskowanie górna/dolna nie zostanie zastosowane, jeśli w pierwszym etapie zostanie jawnie wpisany argument (E). np:

podane

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

mogę powołać Choose z wyraźnych argumentów typ:

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

W odniesieniu do wprowadzania małych lub niższy aut wnioskowania, istnieją pewne implikacje całej 7.5.2 które decydują, czy wnioskowanie o dolnej lub górnej granicy jest w ogóle możliwe. Na przykład, 7.5.2.9 (i .10) szczegóły, że parametr typu to nieodfikowany, aby wystąpić wnioskowanie o górnej lub dolnej granicy. 7.5.2.5 szczegóły, że parametr typu jest unieważniany tylko wtedy, gdy parametr tego typu zależy od innego parametru o niepoprawionym typie. Na przykład

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

TResult „zależy” TSource, ponieważ typ TSource mógłby określić typ TResult. na przykład z połączeniem takim jak Select(c, e->Name), TResult zależy od typu Name w TSource.

w zakresie górnego i dolnego granic wnioskowania w odniesieniu do danego typu parametru nieutrwalonej (X), którego typu (v) nie są wyraźnie uznane (patrz paragraf pierwszy), górne lub dolne granice typu parametru (E) typu U są wydedukowane. Jeśli parametr typu jest kowariancyjny (ma modyfikator out) i jeden z typów w zestawie o dolnym ograniczeniu jest kandydatem do parametru, wystąpiło wyrażenie o niższej granicy. Odwrotnie, jeśli parametr typu jest contravariant (ma modyfikator 'in') i jeden z typów w zestawie górnego ograniczenia jest kandydatem do parametru, to wystąpiło wywarcie o górnej granicy. na przykładz Select(c, e->e.Name) i c był IEnumerable<Mammal> następnie kompilator byłoby wywnioskować niższy związany z Mammal ponieważ parametr typu w IEnumerable jest kowariantna (np to uznane IEnumerable<out T>. Gdyby zostały uznane IEnumerable<in T> następnie górną związanego byłoby wywnioskować. A gdyby było oświadczył Enumerabale<T> --with bez in lub out wtedy byłoby niezmienna ani Ograniczenie górne granice ani niższego wnioskowanie byłoby zastosować.)

Oczywiście, jeśli typ parametru może być ani kowariantna ani kontrawariantny potem musi nastąpić dokładne dopasowanie

+0

Jak do cholery wiesz to? –

+0

Świetne wyjaśnienie Peter. –

Powiązane problemy