2010-05-23 9 views
1

J'ai un doute sur la portée des variables dans les fonctions anonymes en C#.Portée des variables à l'intérieur des fonctions anonymes en C#

Tenir compte du programme ci-dessous:

delegate void OtherDel(int x); 

     public static void Main() 
     { 
      OtherDel del2; 
      { 
       int y = 4; 
       del2 = delegate 
       { 
         Console.WriteLine("{0}", y);//Is y out of scope 
       }; 
      } 

      del2(); 
     } 

Mon VS2008 IDE donne les erreurs suivantes: [pratique est une classe à l'intérieur namespace pratique]

1.error CS1643: Tous les chemins de code renvoient une valeur dans la méthode anonyme de type 'Practice.Practice.OtherDel' 2.erreur CS1593: Le délégué 'OtherDel' ne prend pas les '0' arguments.

Il est indiqué dans un livre: Illustrated C# 2008 (Page 373) que la variable int y est dans la portée de la définition del2. Alors pourquoi ces erreurs.

Répondre

4

Deux problèmes;

  1. vous ne passe pas quoi que ce soit dans votre del2() Invoke, mais il (OtherDel) prend un entier que vous n'utilisez pas - vous avez encore besoin de fournir, bien que (les méthodes anonymes laissent silencieusement vous ne déclarez pas les params si vous ne les utilisez pas - ils existent encore, bien - votre méthode est essentiellement le même que del2 = delegate(int notUsed) {...})
  2. le délégué (OtherDel) doit renvoyer un int - votre méthode ne

La portée est bonne.

+0

# 1 est complètement correct, mais # 2: vérifiez la déclaration de type 'OtherDel' en haut du code de l'OP:' delegate void OtherDel (int x) '- il ne retourne rien. [EDIT: cela a été changé dans un edit à la question] – Richard

+0

La réponse reflète la question au moment où j'ai posté ce; p –

2

L'erreur n'a rien à voir avec les étendues. Votre délégué doit retourner une valeur entière et prendre une valeur entière en tant que paramètre:

del2 = someInt => 
{ 
    Console.WriteLine("{0}", y); 
    return 17; 
}; 
int result = del2(5); 

donc votre code pourrait ressembler à ceci:

delegate int OtherDel(int x); 
public static void Main() 
{ 
    int y = 4; 
    OtherDel del = x => 
    { 
     Console.WriteLine("{0}", x); 
     return x; 
    }; 
    int result = del(y); 
} 
Questions connexes