C#编译器类型推断内联方法调用和单独方法调用之间的区别

时间:2012-06-05 21:05:18

标签: c# .net compiler-construction type-inference

似乎C#编译器根据方法的调用方式推断出类型:

void Foo<T>() where T : Bar
{
   var instance = new T()
   {
      ID = 1
   }.
   ExtensionMethod();
}

在这种情况下,编译器似乎推断出实例的类型是Bar,因为我有一个类Bar,其中声明了ExtensionMethod。

void Foo<T>() where T : Bar
{
   var instance = new T()
   {
      ID = 1
   };
   instance.ExtensionMethod();
}

在这种情况下,编译器推断出实例的类型是T,这也是我在第一种情况下所期望的。 为什么会有这样的差异?

2 个答案:

答案 0 :(得分:4)

在第一种情况下,您将方法调用的结果分配给实例。在第二种情况下,您将丢弃呼叫的结果。相反,您指定new T这是唯一的区别。

答案 1 :(得分:1)

根据Implicitly Typed Local Variables 中的var关键字定义:

  

var关键字指示编译器推断出类型   来自初始化右侧表达式的变量   声明

var右侧侧,在您的情况下,不仅 ctor部分,还有函数调用,返回void。因此,在推断可以从函数调用返回的var中分配给void的类型。这导致了一个关于事实的编译器信号:

无法将void分配给隐式类型的局部变量