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