web-dev-qa-db-fra.com

Méthodes statiques et d'instance avec le même nom?

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

Je reçois une erreur de compilateur lorsque j'essaie de faire cela, mais pour une raison quelconque, je pensais qu'il y avait un moyen de faire cela. Ai-je tort ou il 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, y a-t-il un bon moyen de mettre en œuvre quelque chose comme celui-ci pouvant être appliqué de manière générique à toute situation?

ÉDITER
[.____] des réponses que j'ai reçues, il est clair qu'il n'ya aucun moyen de le faire. Je vais avec un autre système de dénomination pour résoudre ce problème.

52
Dan Herbert

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

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

58
ckramer

En fait, il s'agit d'un moyen de l'accomplir en mettant explicitement mis en œuvre une interface. Ce n'est pas une solution parfaite mais cela peut travailler dans certains cas.

interface IFoo
{
    void Bar();
}

class Foo : IFoo
{
    static void Bar()
    {
    }

    void IFoo.Bar()
    {
        Bar();
    }
}

Je rencontre parfois cette situation lorsque je fais des cours d'emballage pour les appels P/invoke.

47
andasa

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

class Foo
{
    static void Bar()
    {
    }

    void Fizz()
    {
        Bar();
    }
}

... Donc, il est logique que vous ne seriez 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 des détails. Je renommerais juste une des méthodes.

12
Matt Hamilton

C # n'est pas bien conçu quand il s'agit de cette ...

Bien qu'il soit vrai que vous pouvez vouloir le global ou non global, il devrait en choisir un par défaut, et si vous voulez l'autre, vous le qualifiez simplement plus.

class Logger {
   public static Logger instance;

   public static void Log(string message) {
       instance.Log(message); // currently the compiler thinks this is ambiguous, but really its not at all.  Clearly we want the non-static method
   }

   public void Log(string 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
   }
}
3
Nick Sotiros

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

Autre complet OO Langues (comme Smalltalk) Ne laissez pas cela et sa juste confusion aux personnes qui comprennent des objets. La séparation entre le côté de l'instance et la classe (ou statique) est très importante et ayant Une langue qui favorise la confusion dans ces détails est ........ Pas une bonne idée ... mais typique du type de type que nous attendons de la SP.

Adrian

0
Adrian

Vous pouvez avoir une méthode statique et d'instance avec le même nom, tant que leur déclaration diffère dans le nombre ou le type de paramètres. C'est la même règle sur la manière dont vous pouvez avoir deux méthodes d'instance avec le même nom dans une classe.

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

Mise à jour: J'ai commis une erreur. Les valeurs de retour ne sont pas suffisantes pour avoir une signature différente.

0
Franci Penov