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
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. –
@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 ..... –
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. –