Méthodes statiques et d’instance portant le même nom?

J’ai une classe avec à la fois une interface statique et une interface non statique en C #. Est-il possible d’avoir une méthode statique et une méthode non statique dans une classe avec le même nom et la même signature?

J’obtiens une erreur de compilation lorsque j’essaie de le faire, mais pour une raison quelconque, je pensais qu’il y avait un moyen de le faire. Ai-je tort ou n’y a-t-il aucun moyen d’avoir des méthodes statiques et non statiques dans la même classe?

Si cela n’est pas possible, existe-t-il un moyen efficace de mettre en œuvre quelque chose de ce type, applicable de manière générique à toute situation?

MODIFIER
D’après les réponses que j’ai reçues, il est clair qu’il n’y a aucun moyen de le faire. Je vais avec un système de nommage différent pour contourner ce problème.

Non tu ne peux pas. La raison de cette limitation est que les méthodes statiques peuvent également être appelées à partir de contextes non statiques sans avoir à append le nom de la classe (donc MyStaticMethod () au lieu de MyClass.MyStaticMethod ()). Le compilateur ne peut pas dire ce que vous recherchez si vous avez les deux.

Vous pouvez avoir des méthodes statiques et non statiques avec le même nom, mais des parameters différents suivant les mêmes règles que la surcharge de méthode, ils ne peuvent tout simplement pas avoir exactement la même signature.

En fait, il existe un moyen d’y parvenir en implémentant explicitement une interface. Ce n’est pas une solution parfaite mais cela peut fonctionner dans certains cas.

interface IFoo { void Bar(); } class Foo : IFoo { static void Bar() { } void IFoo.Bar() { Bar(); } } 

Je rencontre parfois cette situation lorsque je crée des classes wrapper pour les appels P / Invoke.

Vous pouvez appeler des méthodes statiques à partir de méthodes d’instance sans avoir à spécifier le nom du type:

 class Foo { static void Bar() { } void Fizz() { Bar(); } } 

… il est donc logique que vous ne soyez pas autorisé à avoir une méthode statique et une méthode d’instance avec la même signature.

Qu’est-ce que vous essayez d’accomplir? Il est difficile de suggérer une solution de contournement sans connaître les détails. Je voudrais juste renommer l’une des méthodes.

C # n’est pas bien conçu quand il s’agit de cela …

S’il est vrai que vous pouvez vouloir le global ou le non-global, il devrait en choisir un par défaut, et si vous voulez l’autre, alors vous le qualifiez simplement plus.

 class Logger { public static Logger instance; public static void Log(ssortingng message) { instance.Log(message); // currently the comstackr thinks this is ambiguous, but really its not at all. Clearly we want the non-static method } public void Log(ssortingng message) { } public void DoStuff() { Log("doing instance stuff"); // this could be ambiguous, but in my opinion it should default to a call to this.Log() Logger.Log("doing global stuff"); // if you want the global qualify it explicitly } } 

Vous pouvez avoir une méthode statique et une méthode d’instance avec le même nom, tant que leur déclaration diffère par le nombre ou le type de parameters. C’est la même règle sur la façon dont vous pouvez avoir deux méthodes d’instance portant le même nom dans une classe.

Bien que techniquement, dans le cas de la méthode statique vs instance, ils diffèrent déjà par la présence de ce paramètre implicite dans la méthode d’instance, cette différence ne suffit pas pour que le compilateur détermine lequel des deux vous voulez appeler.

Mise à jour : j’ai fait une erreur. Les valeurs de retour ne suffisent pas pour avoir une signature différente.

D’ACCORD. La racine de ce problème est que C # ne doit pas vous permettre d’appeler une méthode statique à partir d’une méthode d’instance sans spécifier le nom du type.

D’autres langages OO complets (comme Smalltalk) ne permettent pas cela et aussi sa juste confusion pour les personnes qui comprennent les objects. La séparation entre le côté de l’instance et le côté de la classe (ou statique) est très importante et le fait d’avoir un langage qui favorise la confusion dans ces détails est … pas une bonne idée … mais typique du type attendu de MS.

Adrian