2010-11-05 23 views
2

Après réécriture de ma fonction d'invocation d'événement pour gérer les événements et leurs arguments de manière générique, j'ai commencé à passer en revue mon code (pour faire correspondre le changement), et j'ai remarqué que le compilateur a implicitement fait l'appel générique.Fonctionnalité du compilateur C# ou suis-je en train de perdre la tête?

Voilà ma fonction:

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

et est la ligne ici pour appeler la fonction:

InvokeEvent(AfterInteraction, result); 

Cette compile sans problème, et l'IntelliSense affiche même l'appel « correct » (avec la partie).

Est-ce une fonctionnalité de compilateur (le type générique peut, en fait, être déduit directement du second argument), ou est-ce que je deviens fou de rien et manque le point?

Répondre

6

Si le compilateur peut déduire tous les paramètres de type, vous n'avez pas besoin de les spécifier explicitement. Dans ce cas, il peut déduire TArgs du deuxième paramètre.

Mais s'il ne peut pas déduire tous les paramètres de type, vous devez les spécifier tous, même ceux que le compilateur peut déduire.

+0

Eh oui ce compilateur est assez intelligent ... –

2

Comme vous l'avez dit, le compilateur a déduit le type du second argument.

3

Il est inférence de type d'appel, lu à ce sujet here, recherchez le chapitre « Type Inference »