Upper-bound inferences
An upper-bound inference from a type U to a type V is made as follows: · If V is one of the unfixed Xi then U is added to the set of upper bounds for Xi. · Otherwise, sets V1…Vk and U1…Uk are determined by checking if any of the following cases apply: · U is an array type U1[…]and V is an array type V1[…]of the same rank · U is one of IEnumerable<Ue>, ICollection<Ue> or IList<Ue> and V is a one-dimensional array type Ve[] · U is the type U1? and V is the type V1? · U is constructed class, struct, interface or delegate type C<U1…Uk> and V is a class, struct, interface or delegate type which is identical to, inherits from (directly or indirectly), or implements (directly or indirectly) a unique type C<V1…Vk> (The “uniqueness” restriction means that if we have interface C<T>{} class V<Z>: C<X<Z>>, C<Y<Z>>{}, then no inference is made when inferring from C<U1> to V<Q>. Inferences are not made from U1 to either X<Q> or Y<Q>.) If any of these cases apply then an inference is made from each Ui to the corresponding Vi as follows: · If Ui is not known to be a reference type then an exact inference is made · Otherwise, if V is an array type then an upper-bound inference is made · Otherwise, if U is C<U1…Uk> then inference depends on the i-th type parameter of C: · If it is covariant then an upper-bound inference is made. · If it is contravariant then a lower-bound inference is made. · If it is invariant then an exact inference is made. · Otherwise, no inferences are made. Fixing An unfixed type variable Xi with a set of bounds is fixed as follows: · The set of candidate types Uj starts out as the set of all types in the set of bounds for Xi. · We then examine each bound for Xi in turn: For each exact bound U of Xi all types Uj which are not identical to U are removed from the candidate set. For each lower bound U of Xi all types Uj to which there is not an implicit conversion from U are removed from the candidate set. For each upper bound U of Xi all types Uj from which there is not an implicit conversion to U are removed from the candidate set. · If among the remaining candidate types Uj there is a unique type V from which there is an implicit conversion to all the other candidate types, then Xi is fixed to V. · Otherwise, type inference fails.
|