2009-11-15 5 views
0

J'apprends l'expression lambda et les délégués. Pendant que j'essaie d'exécuter ce qui suit, j'obtiens une erreur sur la ligne marquée en gras. (Erreur: L'opérateur '+ =' ne peut pas être appliqué aux opérandes de type 'Test.MessageDelegate' et 'expression lambda') .Aidez-moi à gérer l'expression lambda.C# Lambda expression -Help

namespace Test 
{ 
    public delegate void MessageDelegate(string title,object sender,EventArgs e); 
    class Program 
    { 
     static event MessageDelegate logEvent; 

     static void Main(string[] args) 
     { 
      logEvent = new MessageDelegate(OnLog); 
      logEvent("title",Program.logEvent,EventArgs.Empty); 
logevent + = (src, e) => {onlog ("Some", Src, e); }
  Console.ReadKey(true); 

     } 

     static void OnLog(string title, object sender, EventArgs e) 
     { 
      if (logEvent != null) 
      { 
       Console.WriteLine("title={0}", title); 
       Console.WriteLine("sender={0}", sender); 
       Console.WriteLine("arguments={0}",e.GetType()); 
      } 
     } 
    } 

} 

Répondre

5

Depuis logevent a MessageDelegate comme gestionnaire d'événements, vous aurez besoin de la main gauche de l'expression lambda (src, e) pour correspondre à la signature de MessageDelegate

Modification (str, src, e) => OnLog(str, src, e)

+0

Supposons que si je mets à jour mon Main() comme logEvent + = (str, src, e) => {OnLog ("Un", Program.logEvent, EventArgs.Empty); } logEvent + = (str, src, e) => {OnLog ("Deux", Program.logEvent, EventArgs.Empty); } (rien n'est exécuté, comment puis-je l'appeler?) – user196546

+0

Je veux dire, considère que Main() a seulement deux lignes comme indiqué dans le commentaire ci-dessus. – user196546

+0

Hmm, je ne suis pas sûr de suivre ce que vous voulez faire ici. Le "+ =" affecte un écouteur à un certain événement. Lorsque logEvent arrive, invoquez OnLog. Cette ligne de code elle-même ne déclenche pas l'événement de journal, elle indique seulement que faire * quand * l'événement est déclenché. Pour augmenter l'événement de journal, vous devriez faire 'si (logEvent! = Null) logEvent ("title", this, null);' (ou ce que vous voulez passer) –