Lower-bound inferences. A lower-bound inference from a type U to a type V is made as follows:
A lower-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 lower bounds for Xi. · Otherwise, if V is the type V1? and U is the type U1? then a lower bound inference is made from U1 to V1. · Otherwise, sets U1…Uk and V1…Vk are determined by checking if any of the following cases apply: · V is an array type V1[…]and U is an array type U1[…] (or a type parameter whose effective base type is U1[…]) of the same rank · V is one of IEnumerable<V1>, ICollection<V1> or IList<V1> and U is a one-dimensional array type U1[](or a type parameter whose effective base type is U1[]) · V is a constructed class, struct, interface or delegate type C<V1…Vk> and there is a unique type C<U1…Uk> such that U (or, if U is a type parameter, its effective base class or any member of its effective interface set) is identical to, inherits from (directly or indirectly), or implements (directly or indirectly) C<U1…Uk>. (The “uniqueness” restriction means that in the case interface C<T>{} class U: C<X>, C<Y>{}, then no inference is made when inferring from U to C<T> because U1 could be X or Y.) 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 U is an array type then a lower-bound inference is made · Otherwise, if V is C<V1…Vk> then inference depends on the i-th type parameter of C: · If it is covariant then a lower-bound inference is made. · If it is contravariant then an upper-bound inference is made. · If it is invariant then an exact inference is made. · Otherwise, no inferences are made.
|