1

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

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

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

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

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

4

2 回答 2

4

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

于 2012-06-05T21:18:02.263 回答
1

根据隐式类型局部变量var中的关键字定义:

var 关键字指示编译器从初始化语句右侧的表达式推断变量的类型

在您的情况下,在右侧不仅有零件,还有一个函数调用,它返回 void。因此,事实证明是从函数调用返回的推断可分配给的类型。这会导致编译器发出关于一个事实的信号:varctorvarvoid

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

于 2012-06-05T21:25:19.713 回答