可能重复:
谁最后决定什么是通用类型?
正如我的问题标题所说,任何人都可以向我解释什么是界限(上限、下限、精确界限)以及它们如何通过示例在类型推断中发挥作用?
考虑简单的代码:
void func<T> ( T firstparam , T secondparam) { }
来电者称它为
func( 23 , 23.23 );
类型推断过程发生时的界限是什么以及推断过程如何使用它们?如果我提出的示例是微不足道的并且没有任何上限等,请包括您自己的示例来代表这个想法。
可能重复:
谁最后决定什么是通用类型?
正如我的问题标题所说,任何人都可以向我解释什么是界限(上限、下限、精确界限)以及它们如何通过示例在类型推断中发挥作用?
考虑简单的代码:
void func<T> ( T firstparam , T secondparam) { }
来电者称它为
func( 23 , 23.23 );
类型推断过程发生时的界限是什么以及推断过程如何使用它们?如果我提出的示例是微不足道的并且没有任何上限等,请包括您自己的示例来代表这个想法。
在您的示例中,类型推断没有界限。如果你这样称呼它
func( 23 , 23.23 );
那么类型的候选者将是int
and double
。Int
可以隐式转换为double
但不能反之亦然,因此固定类型T
为double
. 这与边界无关,而是类型兼容性。
但是,如果你这样称呼它
func( new object() , 23.23 );
那么上限为T
,object
下限为double
。在这种情况下,固定类型T
将是object
.
Eric Lippert在博客文章“我们如何确保方法类型推断终止?
Jon Skeet在他的精彩书籍 C# in Depth中详细描述了类型推断的过程9.4.3 两阶段类型推断。请仔细阅读他对清单9.11类型推断的描述
我不知道您所说的类型 bounds是什么意思,但在您的示例中,23
is an int
,23.23
是 double ,并且 anint
可以自动转换为 a double
。因此,由于编译器可以将两个参数视为相同的类型 ( double
),因此它推断T
为double
。