2009-09-29 4 views
1

Quelle est la raison pour laquelle je ne peux pas mettre de parenthèses après le nom de ma méthode lorsque je l'attribue à un type de délégué.Pourquoi ne pas ajouter de parenthèses lors de l'affectation d'une méthode à un délégué?

Voici le code:

public delegate Simple Simple(); //Create a delegate that returns its own type. 

class Program 
{ 
    public class Exercise 
    { 
     public static Simple Welcome() 
     { 
      Console.WriteLine("Welcome!"); 
      return null; 

     } 
    } 
    static void Main(string[] args) 
    { 
     Simple msg; 
     msg = Exercise.Welcome(); //Since Welcome returns Simple, I can execute it. 

     msg(); 
     Console.Read(); 
    } 
} 

Répondre

13

Il permet au compilateur de distinguer un appel de méthode à partir d'une référence à une groupe de méthode. Si vous ajoutez des parenthèses, le compilateur appelle la méthode et utilise la valeur de retour de cet appel de méthode, au lieu du groupe de méthodes lui-même.

+0

So Bienvenue(); ce serait comme appeler la méthode, alors que, bienvenue; est une référence à la méthode. Est-ce que j'ai ce droit? Je me sens stupide, lol. – Xaisoft

+0

Oui. Vous avez bien compris. –

+0

Comme je l'ai mentionné dans un autre commentaire à l'autre affiche, j'ai demandé s'il est réellement possible d'assigner un délégué et de l'appeler en même temps. – Xaisoft

4

Parce que () exécute la méthode. Et comme vous l'avez dit vous-même, vous l'attribuez, pas l'exécutez. Si vous avez utilisé des parenthèses là où vous l'avez indiqué, vous affectez le résultat de l'exécution de la méthode, sans affecter la méthode.

+0

Quand je mets des parenthèses, ça me donne quand même une erreur, donc je suppose que c'est intégré dans le compilateur pour vérifier ça. – Xaisoft

+0

J'ai juste pensé à quelque chose, et si je voulais vraiment l'assigner et l'appeler en même temps. c'est possible ou pas? – Xaisoft

+0

Non, pourquoi le voudriez-vous? Si vous voulez attribuer et appeler, puis 1) affecter, et 2) appeler :) –

4

Tenir compte de ce code:

delegate Foo Foo(); // yes, this is legal - a delegate to method that returns 
        // the same kind of delegate (possibly to a different method, 
        // or null) 

class Program 
{ 
    static Foo GetFoo() { return null; } 

    static void Main() 
    { 
     Foo foo; 

     foo = GetFoo; // assign a delegate for method GetFoo to foo 

     foo = GetFoo(); // assign a delegate returned from an invocation 
         // of GetFoo() to foo 
    } 
} 

Espérons que cela montre clairement pourquoi les parenthèses doivent être importantes.

+0

Est-ce que la ligne délègue réellement Foo Foo() en retournant le même type de délégué ou est-ce qu'elle renvoie un type défini par l'utilisateur comme une classe ou une structure? – Xaisoft

+0

foo = GetFoo(); prête à confusion. – Xaisoft

+0

si vous omettez foo = GetFoo ;, je suppose que cela ne fonctionnera pas, correct. Suis-je sur la bonne voie ici? foo = GetFoo; met le type Foo dans foo, alors food = GetFoo(); est valable. Est-ce que j'ai bien compris? – Xaisoft

Questions connexes