2010-09-16 3 views
0

Je viens de tomber sur ce comportement étrange aujourd'hui:inattendue erreur c compilateur # Implémentation d'interface

interface IFooBar 
{ 
    void Foo(); 
    void Bar(); 
} 

class FooBar : IFooBar 
{ 
    void IFooBar.Foo() 
    { 
    } 

    void IFooBar.Bar() 
    { 
     this.Foo(); 
    } 
} 

La ligne this.Foo(); soulève l'erreur du compilateur

« MyProject.FooBar » ne contient pas de définition pour « Foo » et aucune extension méthode « Foo » accepter un premier argument de type « MyProject.FooBar » se trouve (? Il vous manque un avec la directive ou un ensemble référence)

Si je choisis les méthodes publiques au lieu du style de déclaration interface.Procédé, le code compile:

class FooBarOk : IFooBar 
{ 
    public void Foo() 
    { 
    } 

    public void Bar() 
    { 
     this.Foo(); 
    } 
} 

Je voudrais comprendre pourquoi cette erreur est soulevée, et comment il peut être contourné en utilisant la notation interface.Procédé

Répondre

1

Pour travailler autour d'elle, vous pouvez écrire:

((IFooBar)this).Foo(); 

Jetez un oeil à la Explicit Interface Implementation Tutorial pour répondre pourquoi this.Foo() ne fonctionne pas.

+0

Merci pour le lien et la phrase magique: "Lorsqu'un membre est explicitement implémenté, il n'est pas accessible via une instance de classe, mais seulement via une instance de l'interface." – devio

0

Ce que l'on appelle l'implémentation d'interface explicite. Il vous permet de mettre en œuvre une interface sans exposer ces méthodes publiquement. Par exemple, vous pouvez implémenter IDisposable mais fournir une méthode publique Close() qui peut avoir plus de sens pour les utilisateurs de votre API. En interne, la méthode IDisposable.Dispose() appelle votre méthode Close.

interface IFooBar 
{ 
    void Foo(); 
    void Bar(); 
} 

class FooBar : IFooBar 
{ 
    void IFooBar.Foo() 
    { 
    } 

    void IFooBar.Bar() 
    { 
     ((IFooBar)this).Foo(); 
    } 
} 

est un moyen pour vous d'appeler la méthode Foo

1

Avez-vous essayé d'utiliser la syntaxe d'interface dans le code?

((IFooBar)this).Foo(); 

j'attendre à ce qu'il est parce que la mise en œuvre est effectivement caché, veiller à ce que vous devez jeter un IFooBar afin de l'utiliser.