Похоже, что 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();
}
В этом случае компилятор делает вывод, что тип экземпляра Т, который является то, что я ожидал бы это делать в первом случае. Почему такая разница?
Параметр '.' оператор имеет очень высокий приоритет, и оператор присваивания' = 'имеет очень низкий. См. [Spec] (http://msdn.microsoft.com/en-us/library/6a71f45d.aspx). Поэтому в вашем первом примере экземпляр установлен на все '(новый T() {ID = 1} .ExtensionMethod())'. Это похоже на разницу между 'var inst = (A.B);' и '(var inst = A) .B;' –