与类型推断有关的界限是什么?

时间:2013-01-16 17:39:33

标签: c# generics

  

可能重复:
  Who actually last decide what is the Generic Type?

正如我的问题标题所说,任何人都可以解释我什么是界限(上界,下界,精确界限)以及他们如何在类型推理中扮演角色?

考虑简单的代码:

void func<T> ( T firstparam , T secondparam) { }

并且来电者称之为

func( 23 , 23.23 ); 

类型推断过程发生的界限是什么以及推理过程如何使用它们?如果我提出的例子是微不足道的,并且不会有任何上限等,请包含你自己的例子来表示这个想法。

2 个答案:

答案 0 :(得分:5)

在您的示例中,类型推断没有界限。如果你称之为

 func( 23 , 23.23 ); 

然后,类型的候选人将是intdoubleInt可以隐式投放到double但不反过来,因此T的固定类型为double。这与边界无关,但与类型兼容。

但是,如果你称之为

func( new object() , 23.23 );

然后T的上限为object,下限为double。在这种情况下,T的固定类型将为object

Eric Lippert描述界限是什么以及为什么他们在How do we ensure that method type inference terminates?

上的博客帖子中分隔下限,上限和精确界限

Jon Skeet在其精彩的C#深度书中详细描述了 9.4.3两阶段类型推理中的类型推断过程。请仔细阅读他的描述,以便列出 9.11

的类型推断

答案 1 :(得分:1)

我不知道类型边界的含义,但在您的示例中,23int23.23是双倍的, int可自动转换为double。因此,由于编译器可以将两个参数视为相同类型(double),因此它推断Tdouble