【问题标题】:C# compiler type inference difference between inline method call and separate method callC#编译器类型推断内联方法调用和单独方法调用之间的区别
【发布时间】:2012-06-05 21:05:18
【问题描述】:

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,这也是我希望它在第一种情况下所做的事情。 为什么会有这样的差异?

【问题讨论】:

  • . 运算符的优先级很高,而赋值运算符= 的优先级很低。见spec。因此,在您的第一个示例中,instance 设置为所有( new T() { ID = 1}.ExtensionMethod() )。这就像var inst = (A.B);(var inst = A).B;之间的区别

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2017-05-20
      • 2021-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      相关资源
      最近更新 更多