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,这也是我期望它在第一种情况下执行的操作。 为什么会有这样的差异?
在第一种情况下,您将方法调用的结果分配给实例。在第二种情况下,您将丢弃调用的结果。相反,您分配
new T
这是唯一的区别。
根据
隐式类型局部变量中
var
关键字定义:
var 关键字指示编译器推断类型 来自初始化右侧表达式的变量 声明
在var
的
右侧,在你的例子中,不仅有
ctor
部分,还有一个函数调用,它返回void。因此,在infering 中,可以从函数调用返回的
var
分配给
void
的类型。这会导致编译器发出关于以下事实的信号:
无法将 void 分配给隐式类型的局部变量