2012-06-05 2 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(); 
} 

В этом случае компилятор делает вывод, что тип экземпляра Т, который является то, что я ожидал бы это делать в первом случае. Почему такая разница?

+0

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

ответ

4

В первом случае вы назначаете результат вызова метода экземпляру. Во втором случае вы отказываетесь от результата вызова. Вместо этого вы назначаете new T. Это единственное различие.

1

Согласно определению var ключевого слова в Implicitly Typed Local Variables:

Значение переменной ключевое слово инструктирует компилятор определить тип переменной из выражения на правой стороне инициализации заявление

На правая сторона var, в вашем случае есть не толькоctor часть, но и вызов функции, который возвращает void. Так получается в , вызывая тип, назначаемый var от void, возвращенный вызовом функции. Это приводит к компилятором сигнал о факте:

Невозможно присвоить непорочную неявно типизированных локальных переменных

Смежные вопросы