2008-12-21 9 views
2

Dans n'importe quelle classe, comment faire explicitement référence à une certaine méthode de ma classe?Quel est le nom complet d'une méthode C#?

Par exemple, ce code fonctionne:

class Test : IEnumerable<T> { 
    public IEnumerator<T> GetEnumerator() { return null; } 
    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } 
} 

Mais celui-ci ne fait pas!

class Test : IEnumerable<T> { 
    IEnumerator<T> IEnumerable<T>.GetEnumerator() { return null; } 
    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } // error 
} 

Comment faire référence à la version générique de ma méthode? En Java je le préfixerais simplement avec le nom de l'interface, mais cela ne semble pas fonctionner en C#. Y at-il un moyen de le faire, autre que ((IEnumerable<T>)this).GetEnumerator()?

EDIT: Je ne suis pas intéressé par "pourquoi" cela ne fonctionne pas de cette façon. Je cherche juste un moyen de le faire. Merci.

Répondre

3

Si vous utilisez une implémentation d'interface explicite, vous devez accéder à la méthode via cette interface.

Donc non, il n'y a pas d'autre moyen que ce que vous proposez dans le texte.

Dans ce cas, vous n'utiliserez généralement pas d'implémentation explicite pour l'interface générique.

Modifier: Si l'avertissement de documentation est la source de vos préoccupations, laissez-moi vous donner un bien meilleur conseil: GhostDoc. Si vous l'installez et que vous le liez, par exemple, Maj + Ctrl + D (par défaut), alors il essaiera de comprendre le nom de vos méthodes et d'ajouter la documentation nécessaire. Ce n'est pas la bonne partie, puisque vous devriez toujours éditer cette partie vous-même, mais si vous héritez des méthodes et des propriétés d'une classe de base, ou comme dans votre cas, une interface, il copiera la documentation automatiquement. Parfois, vous devez l'éditer pour le rendre plus spécifique à votre type, mais en général vous pouvez simplement le laisser.

Il aura également une détection spéciale des modèles typiques. Essayez-le, je suis sûr que vous allez adorer.

+0

Merci. Je voulais utiliser une implémentation d'interface explicite car elle supprime l'avertissement du compilateur pour "méthode publique non documentée". Il semble que je vais devoir copier sa documentation! : s Vive Java! –

1

Eh bien, vous pouvez jeter ...

IEnumerator<T> IEnumerable<T>.GetEnumerator() { return null; } // TODO 
    IEnumerator IEnumerable.GetEnumerator() { 
     return ((IEnumerable<T>)this).GetEnumerator(); 
    } 

ou vous pouvez utiliser une méthode d'instance non publique pour les deux:

IEnumerator<T> IEnumerable<T>.GetEnumerator() { return GetEnumerator(); } 
    IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } 
    private IEnumerator<T> GetEnumerator() { return null; } // TODO 

Personnellement, cependant, je préfère voir une GetEnumerator publique() - même que j'aime un public Dispose() - il est plus facile pour le consommateur de savoir qu'il est là. Je ne pense pas que toutes les implémentations d'interface doivent être publiques (loin de là), mais foreach et using sont si fondamentaux qu'un peu de publicité ne fait pas de mal.

Questions connexes