Résolu C# : Fonctions ayant même nom, mêmes paramètres, mais niveau différent

Solutions (6)
Tags :
  • Signature
  • Programmation
, Légende |
Kikoo :dawa: 

J'ai une colle pour les fanas de C#

J'ai deux fonctions en tous points identiques, à deux détails près :
- l'une est statique, l'autre non ;
- la statique renvoie une nouvelle instance sur laquelle l'opération a été effectuée, l'autre effectue l'opération sur l'instance qui l'appelle, et renvoie void, mais ce n'est qu'un détail.

Evidemment, à la compilation, VS2008 me dit qu'il y a déjà une fonction avec le même nom et les mêmes paramètres, et qu'il y a ambiguïté dans les appels de ces fonctions. Pourtant, si j'appelle la fonction depuis la classe, je ne peux appeler que la statique, tandis que si je l'appelle depuis une instance, j'appelle forcément la non-statique, donc l'ambiguïté est impossible, et ces fonctions sont par-là même différentes... mais non, VS2008 ne veut rien savoir.

Et bien évidemment, vu que c'est un gros projet qui n'a pas besoin d'être davantage compliqué que ça, avec des tas de gens qui bossent dessus aux quatre coins de la planète et qui ne se voient qu'une fois tous les six mois, de grandes parties du code générées automatiquement qui se basent sur le principe de fonctions statiques et non statiques ayant le même nom, sans compter ceux qui vont reprendre le bousin derrière, bref, ça serait carrément complètement cool si on pouvait avoir des noms identiques pour ces deux fonctions, sauf que pas moyen de trouver comment résoudre ce problème.

Quelqu'un qu'il a une idée de comment on pourrait contourner ce problème ? :D 

Voilà un exemple de code pour aider un peu à comprendre :

  1. class Kikoo
  2. {
  3. private int Valeur;
  4.  
  5. public Kikoo(int Valeur)
  6. {
  7. this.Valeur = Valeur;
  8. }
  9.  
  10. public void Assigner(int Valeur) //Assigner non statique
  11. {//Erreur à la compilation: y'a déjà une fonction avec le même nom et les mêmes paramètres gna gna gna...
  12. this.Valeur = Valeur;
  13. }
  14.  
  15. public static Kikoo Assigner(int Valeur) //Assigner statique
  16. {//Erreur à la compilation: y'a déjà une fonction avec le même nom et les mêmes paramètres gna gna gna...
  17. return new Kikoo(Valeur);
  18. }
  19.  
  20. public static void FonctionBidonDontLaSeuleRaisonDetreEstDeFaireAppelAlaFonctionAssigner(int Valeur)
  21. {
  22. Kikoo LoL = new Kikoo(0);
  23. LoL.Assigner(1); //Appel évident de la fonction non statique
  24. //Erreur à la compilation: ambiguïté gna gna gna...
  25. }
  26.  
  27. public static void FonctionBidonDontLaSeuleRaisonDetreEstDeFaireAppelAlaFonctionAssignerStatique(int Valeur)
  28. {
  29. Kikoo LoL = Assigner(1); //Appel évident de la fonction statique
  30. //Erreur à la compilation: ambiguïté gna gna gna...
  31. }
  32. }


Merci d'avance toussa :hello: 
Contenus similaires
Meilleure solution
partage
|
Citation :
On ne peut appeler la méthode statique QUE depuis la classe, pas depuis une instance, et on ne peut appeler la méthode membre QUE depuis une instance évidemment.

Ce que tu ne peux pas faire, c'est instance.MethodeStatic(). Par contre, dans une instance, dans une méthode membre, tu peux accéder aux méthodes et variables de classe en indiquant directement la signature. par exemple, dans la méthode membre toto(), tu peux faire appel à MethodeStatic(), qui sera retranscrit en Classe.MethodeStatic(). En revanche, si tu mets This.MethodeStatic() ça génère une erreur.
Cf specs: 10.2.5 Static and instance members
Donc, tu as bien 1 signature pour 2 possibilités: l'appel à la méthode membre, et l'appel à la méthode de classe.

Si tu arrives à compiler avec les 2 signatures (une dans la classe et l'autre dans la meta-classe), alors peut-être qu'en précisant les origines This.methodeMembre() et TaClasse.MethodeStatic() ça fonctionnerait. Même si ça fonctionne, ça reste pour moi une erreur de programmation.

Citation :
Justement, personne a vérifié si ça marchait. C'est parti de la supposition que ça marchait, et quand on m'en a parlé, je me suis moi-même dit "ça devrait passer :dawa: ". Maintenant que je me retrouve à faire ça, ben ça passe pas.

Et en plus vous aviez vu l'erreur de programmation, alors ça devient même une erreur de gestion de projet. :p 

Citation :
Il me semble que deux fonctions qui ont le même nom ne peuvent pas avoir un retour différent. Dans un cas tu as une void et dans l'autre un Kikoo.

Oui, les retours ne sont pas dans les signatures.
  • Commenter cette solution |
Score
0
òh
òi
, Légende |
CRicky a dit :
dans la méthode membre toto(), tu peux faire appel à MethodeStatic(), qui sera retranscrit en Classe.MethodeStatic(). En revanche, si tu mets This.MethodeStatic() ça génère une erreur.
Bien vu, j'avais pas pensé à ça. Du coup, ce simple fait tue toute possibilité de résoudre le problème, purement et simplement.

CRicky a dit :
Et en plus vous aviez vu l'erreur de programmation, alors ça devient même une erreur de gestion de projet. :p 
Les autres, moi je suis sur le projet que depuis lundi hein :o 
Du coup je vais leur dire qu'il faut tout changer, ça va être marrant :dawa: 

Merci pour le coup de main, tu mérites d'avoir le fond de ton post jaune pisse.
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Y'a aussi le problème de retour.
Il me semble que deux fonctions qui ont le même nom ne peuvent pas avoir un retour différent. Dans un cas tu as une void et dans l'autre un Kikoo.
  • Commenter cette réponse |
Score
0
òh
òi
, Légende |
CRicky a dit :
Comment veux-tu que compilateur s'y retrouve puisque dans une méthode membre on peut appeler une méthode de classe, ça fait une signature appelante, pour 2 signatures possibles.
Hé ben non !
On ne peut appeler la méthode statique QUE depuis la classe, pas depuis une instance, et on ne peut appeler la méthode membre QUE depuis une instance évidemment. Du coup, pas d'ambiguïté possible. Le problème c'est que le compilateur bloque sur un problème qui n'en est pas un, vu qu'il ne prend pas en compte le "static". D'ailleurs je sais pas d'où j'ai sorti un problème d'ambiguïté, vu qu'il n'y a aucune erreur de ce genre à la compilation, même s'il est possible qu'il l'omette vu le problème des deux fonctions identiques.

CRicky a dit :
Tu veux dire que chez certains, ça marche ? Peut-être utilisent-ils des paramètres différents qui permettent de différencier les 2 signatures à l'appel ?
Justement, personne a vérifié si ça marchait. C'est parti de la supposition que ça marchait, et quand on m'en a parlé, je me suis moi-même dit "ça devrait passer :dawa: ". Maintenant que je me retrouve à faire ça, ben ça passe pas.
  • Commenter cette réponse |
Score
0
òh
òi
|
Comment veux-tu que compilateur s'y retrouve puisque dans une méthode membre on peut appeler une méthode de classe, ça fait une signature appelante, pour 2 signatures possibles.
Pour moi, donner 2 identifiants de points d'entrée pour 2 fonctionnalités distinctes est une erreur de programmation (et d'ergonomie dans le cas d'une interface utilisateur).

Citation :
...qui se basent sur le principe de fonctions statiques et non statiques ayant le même nom...

Tu veux dire que chez certains, ça marche ? Peut-être utilisent-ils des paramètres différents qui permettent de différencier les 2 signatures à l'appel ?
  • Commenter cette réponse |
Score
0
òh
òi
, Modérateur |
Citation :
Quelqu'un qu'il a une idée de comment on pourrait contourner ce problème ? :D 

Changer un des deux noms de méthode :) 
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS