2010-11-05 2 views
2

После перезаписи функции вызова события для обработки событий и их аргументов в общем, я начал перебирать свой код (чтобы соответствовать изменению), и я заметил, что компилятор неявно сделал общий вызов.Функция компилятора C# или я теряю сознание?

Вот моя функция:

private void InvokeEvent<TArgs>(EventHandler<TArgs> invokedevent, TArgs args) 
    where TArgs : EventArgs 
    { 
     EventHandler<TArgs> temp = invokedevent; 
     if (temp != null) 
     { 
      temp(this, args); 
     } 
    } 

и вот линия для вызова функции:

InvokeEvent(AfterInteraction, result); 

компилируется без проблем, и IntelliSense даже отображать «правильный» вызов (с часть).

Является ли это функцией компилятора (общий тип может быть непосредственно выведен из второго аргумента), или я схожу с ума по всему и не теряю точку?

ответ

6

Если компилятор может вывести все параметры типа, вам не нужно явно указывать их. В этом случае он может вывести TArgs из второго параметра.

Но если он не может вывести все параметры типа, вам нужно указать все из них, даже те, которые мог бы сделать компилятор.

+0

Да что компилятор довольно умный ... –

2

Как вы уже сказали, компилятор имеет выведенный тип из второго аргумента.

3

Это вызов умозаключение типа, читать об этом here, поиск главы «Тип умозаключений»

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