2012-06-05 115 views
1

这似乎是C#编译器推断类型的不同,这取决于如何调用一个方法: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

的'.'操作者具有很高的优先级,并赋值运算符'='有一个非常低。请参阅[规格](http://msdn.microsoft.com/en-us/library/6a71f45d.aspx)。因此,在第一个例子中,实例被设置为全部'(new T(){ID = 1} .ExtensionMethod())'。这就像'var inst =(A.B);'和'(var inst = A).B;'之间的区别 –

回答

4

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

1

根据Implicitly Typed Local Variablesvar关键字定义:

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

权利一面的var,在你的情况下,有不仅ctor部分,但也是一个函数调用,它返回void。所以结果在推断类型varvoid函数调用返回。这导致编译信号有关的事实:

无法分配空隙的隐式类型的局部变量