在C#4.0规范7.5.2.9中:
从类型U到类型V的下限推断被设为 如下:
我已多次浏览此部分。缺少一个部分引用,这个定义读起来就像一个循环引用。所以,我希望在附近找到一个语法制作或章节参考来澄清......我不知道。本节还涉及 Fixing ,它存在类似的定义问题。
什么是upper-bound inference
与lower-bound inference
?
答案 0 :(得分:5)
我会尽力更清楚地描述它。最糟糕的情况是,我用来描述。
上/下推断是关于用于特定泛型方法调用的类型参数的类型推断的分阶段方法的一部分。显然,如果在第一阶段中明确键入参数(E),则不会应用上/下推断。 e.g:
给定的
public static T Choose<T>(T first, T second) {
return (rand.Next(2) == 0)? first: second;
}
我可以使用显式类型参数调用Choose
:
Choose<String>("first", "second");
关于上限或下限推理,7.5.2中的一些含义决定了下限或上限推断是否适用。例如,7.5.2.9(和.10)详细说明了类型参数不固定,可以发生上限或下限推断。 7.5.2.5详细说明当该类型参数依赖于另一个未固定的类型参数时,类型参数仅不固定。例如
IEnumerable<TResult> Select<TSource, TResult>(IEnumerable<TSource> e,
Func<TSource, Result> f)
TResult
“取决于”TSource
,因为TSource
的类型可能会确定TResult
的类型。例如通过Select(c, e->Name)
,TResult
之类的通话取决于Name
中TSource
的类型。
就上限和下限推论而言,对于未明确声明其类型(V)的给定未固定类型参数(X)(参见第一段),上部或下限为推导出类型U的类型参数(E)。如果类型参数是协变的(具有out
修饰符)并且下限集中的一个类型是参数的候选者,则发生下限推断。相反,如果类型参数是逆变的(具有'in'修饰符)并且上限集中的一个类型是参数的候选者,则发生上限推断。例如Select(c, e->e.Name)
和c
为IEnumerable<Mammal>
,编译器会推断出Mammal
的较低范围,因为IEnumerable
中的类型参数是covariant(例如它被声明为IEnumerable<out T>
。如果它被声明为IEnumerable<in T>
,那么将推断出一个上限。如果它被声明为Enumerabale<T>
- 没有in
或{ {1}}然后它将是不变,并且上限和下限推理都不适用。)
显然,如果参数类型既不是协变也不是逆变,那么必须进行精确匹配