2010-10-14 5 views
2

Mes deux versions des déclarations suivantes fonctionnent correctement.Le délégué fonctionne sans création d'instance

1) Func<int,int,int> findMax=Max; 
    Console.WriteLine("Max={0}",findMax(10,20)); 

2)Func<int,int,int> findMax=new Func<int,int,int>(Max); 
    Console.WriteLine("Max={0}",findMax(10,20)); 

public static T Max<T>(T a, T b) where T:IComparable 
{ 
      if (a.CompareTo(b) > 0) return a; 
      else return b; 
} 

listing 2, j'instancié les délégués, mais dans la liste 1 je l'ai fait not.How fait le travail bien le code d'inscription 1 sans création d'instance de délégué Func?

Répondre

2

Ceci est une nouvelle fonctionnalité de C# 2; le compilateur créera implicitement l'instance de délégué.

Ceci est un sucre syntactique pur; l'IL compilé est identique.

4

Non, dans les deux cas, vous avez instancié le délégué. C'est juste que dans la première version, il est caché par une conversion groupe de méthodes. La première forme est effectivement du sucre syntaxique pour le second.

Fondamentalement Max est un groupe de méthodes, et un groupe de méthodes peut être converti en n'importe quel type de délégué compatible.

+0

Opposé. Je suppose que Jon voulait dire que le premier est du sucre syntaxique pour le second :), sinon c'est sur place. –

+0

@ Øyvind: Correction, merci :) –

Questions connexes