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

问题描述 投票:0回答:2

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,这也是我期望它在第一种情况下执行的操作。 为什么会有这样的差异?

c# .net type-inference
2个回答
4
投票

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

new T
这是唯一的区别。


1
投票

根据

隐式类型局部变量
var关键字定义:

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

var

侧,在你的例子中,不仅有ctor
部分,还有一个函数调用,它返回void。因此,在 
infering 中,可以从函数调用返回的 var
 分配给 
void
 的类型。这会导致
编译器发出关于以下事实的信号:

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

© www.soinside.com 2019 - 2024. All rights reserved.