2012-03-28 5 views
8

Dans le code ci-dessous, je dois déclarer la méthode MdrResponseInterpreterstatic sinon j'ai une erreur de compilation.pourquoi déléguer doit être statique?

class.... { 

    private StandardBuilder _mdrResponseBuilder = 
     new StandardBuilder(MdrResponseInterpreter); 

    public static bool MdrResponseInterpreter(DNMessageDeliverer builder, 
               DNFieldSet message) 
    { 
     // .... work 
    } 

Pourquoi? Comme _mdrResponseBuilder est pas statique, je pense que MdrResponseInterpreter devrait pouvoir accéder this

Répondre

11

Parce que initializers sur le terrain n'ont pas accès aux this/membres d'instance. Déplacez l'initialisation vers le constructeur si vous souhaitez accéder aux membres de l'instance.

La spécification dit:

A initialiseur variable pour un champ d'instance ne peut pas faire référence à l'instance en cours de création. Ainsi, il est une erreur de compilation pour faire référence à this dans une initialiseur variables

Bien que votre code ne fait explicitement référence this, le groupe de méthode pour déléguer la conversion ne fait référence this implicitement si la méthode est un membre de l'instance.

1

Vous n'êtes pas autorisé à utiliser des membres d'instance dans les initialiseurs.

Pensez à un délégué comme ayant 1) Une référence d'objet et 2) Une référence de méthode. Comme vous ne pouvez pas accéder à this, il n'existe aucun moyen de définir la référence d'objet. La seule façon de pouvoir utiliser la méthode en tant que délégué est de la déclarer static (car la référence d'un délégué est null pour les méthodes statiques). Déplacer votre initialisation vers le constructeur peut vous aider à contourner cela.

+1

Il y a certainement * un * objet à ce moment-là (sinon où la valeur est-elle assignée?) Mais vous n'êtes pas autorisé à accéder à 'this' pour le moment. –

+0

Bien sûr, je n'étais pas clair. Mise à jour ma réponse – Botz3000

+0

Je dirais encore que ce n'est pas clair. L'objet * existe * entièrement. Il n'a peut-être pas été entièrement initialisé *, mais c'est également vrai dans le corps du constructeur. (Il peut y avoir d'autres corps de constructeurs dérivés qui n'ont pas encore fonctionné ...) –

1

La méthode doit être statique car elle est appelée lors de l'initialisation de l'objet, avant que le constructeur ait commencé à s'exécuter. Si vous souhaitez accéder à this, appelez la méthode d'initialisation depuis l'intérieur de votre constructeur.

5

Pour ajouter à la réponse de CodeInChaos (ce qui est correct), vous pouvez simplement déplacer l'affectation au constructeur:

private StandartBuilder _mdrResponsBuilder; 

public Foo() // Whatever your type is called 
{ 
    // Simpler syntax for creating a delegate, too. Just use a 
    // method group conversion... 
    _mdrResponsBuilder = MdrResponseInterpreter; 
} 

EDIT: Ce qui précède suppose que StandartBuilder est un type de délégué. Si c'est un type avec un constructeur acceptant un type de délégué, alors vous devrez retourner à new StandartBuilder(MdrResponseInterpreter), mais toujours dans le constructeur.

+0

@Downvoter: Envie de commenter? –

+0

Je me demandais juste, comment est-ce que "_mdrResponsBuilder = MdrResponseInterpreter" est correct? Rien dans la question n'indique que StandardBuilder est un délégué ... Il pourrait être une classe acceptant un Func dans son constructeur? Btw, je n'ai pas downvote – odalet

+1

@odalet: Oui, c'est possible. Je pense que c'est plus probable (vu le titre de la question) que c'est un type de délégué. Éditera pour clarifier. –

Questions connexes