上限/下限推理和修正

时间:2013-02-18 14:14:07

标签: c#

在C#4.0规范7.5.2.9中:

  

从类型U到类型V的下限推断被设为   如下:

  • 如果V是未固定的X i 之一,则将U添加到X i 的下限集合中。
  • [...]

我已多次浏览此部分。缺少一个部分引用,这个定义读起来就像一个循环引用。所以,我希望在附近找到一个语法制作或章节参考来澄清......我不知道。本节还涉及 Fixing ,它存在类似的定义问题。

什么是upper-bound inferencelower-bound inference

1 个答案:

答案 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之类的通话取决于NameTSource的类型。

就上限和下限推论而言,对于未明确声明其类型(V)的给定未固定类型参数(X)(参见第一段),上部下限为推导出类型U的类型参数(E)。如果类型参数是协变的(具有out修饰符)并且下限集中的一个类型是参数的候选者,则发生下限推断。相反,如果类型参数是逆变的(具有'in'修饰符)并且上限集中的一个类型是参数的候选者,则发生上限推断。例如Select(c, e->e.Name)cIEnumerable<Mammal>,编译器会推断出Mammal较低范围,因为IEnumerable中的类型参数是covariant(例如它被声明为IEnumerable<out T>。如果它被声明为IEnumerable<in T>,那么将推断出一个上限。如果它被声明为Enumerabale<T> - 没有in或{ {1}}然后它将是不变,并且上限和下限推理都不适用。)

显然,如果参数类型既不是协变也不是逆变,那么必须进行精确匹配