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

C# 与类型推断有关的界限是什么?,c#,generics,C#,Generics,可能重复: 正如我的问题标题所说,谁能解释一下边界(上界、下界、精确界)是什么,以及它们如何在类型推断中发挥作用 考虑简单的代码: void func<T> ( T firstparam , T secondparam) { } 类型推理过程发生时的界限是什么?推理过程如何使用这些界限?。如果我给出的示例非常琐碎且没有任何上界等,请包括您自己的示例,以代表该想法。我不知道您所说的类型边界是什么意思,但在您的示例中,23是一个int,23.23是一个双精度,而int自动转换为dou

可能重复:

正如我的问题标题所说,谁能解释一下边界(上界、下界、精确界)是什么,以及它们如何在类型推断中发挥作用

考虑简单的代码:

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

类型推理过程发生时的界限是什么?推理过程如何使用这些界限?。如果我给出的示例非常琐碎且没有任何上界等,请包括您自己的示例,以代表该想法。

我不知道您所说的类型边界是什么意思,但在您的示例中,
23
是一个
int
23.23
是一个双精度,而
int
自动转换为
double
。因此,由于编译器可以将这两个参数视为同一类型(
double
),因此可以推断
T
double

,在您的示例中,类型推断没有界限。如果你这样称呼它

 func( 23 , 23.23 ); 
然后类型的候选项将是
int
double
Int
可以隐式转换为
double
,但反之亦然,因此
T
的固定类型为
double
。这与边界无关,但与类型兼容性有关

但是,如果你把它叫做

func( new object() , 23.23 );
那么
T
的上限将是
object
,下限将是
double
。在这种情况下,
T
的固定类型将是
object

Eric Lippert在blogpost上描述了什么是界限,以及为什么它们将下限、上限和精确界限分开


Jon Skeet在他的精彩著作《C#Depth》中详细描述了9.4.3两阶段类型推理的过程。请仔细阅读他对清单9.11

中类型推理的描述,Eric Lippert很好地解释了C#@NasmiSabeer中类型推理的边界,他们可能称之为“边界”?@IlyaIvanov感谢文章,它似乎解释了一切)我的答案回答了这个问题,它在C中给出了深入的答案(第9.4节),第249+1页,@HolyKiller,请在问题中内联提供定义。@AlexeiLevenkov我最初认为大多数C#人已经知道这些术语:)现在这个问题有意义了!这只是一个糟糕的例子,把它弄糊涂了。@Ilya+1在问题上加了更多的阴影谢谢你的回答,你能解释一下如何决定哪种类型应该放在上界,哪种类型应该放在下界等等吗。那么推理是如何考虑这些界限的呢?作者确实解释得很好,但是我从来没有接触过界限。我会稍微更新我的答案,但是我不想复述埃里克的博客文章的主题是不平凡的,我可能会在术语上犯错误。此外,它基本上是由编译器团队使用的,而不是像我猜想的那样由普通开发人员使用的。
func( new object() , 23.23 );