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