13 votes

Surcharge des fonctions

Supposons que ces trois méthodes soient définies :

int F1(int, int);
int F1(float, float);
Float F1(int, int);

et j'appelle ici la méthode F1 :

Console.writeline(F1(5,6).ToString()));

Quelle méthode sera appelée et pourquoi ?

26voto

Oded Points 271275

La première et la troisième fonction ne seront pas compilées dans le même espace de noms.

En effet, les signatures de fonctions se différencient par le type et le nombre de paramètres, qui sont identiques. Les types de retour ne sont pas considérés comme faisant partie de la signature de la méthode.

Si vous n'aviez que le premier et le deuxième (ou le deuxième et le troisième) dans l'espace de noms, c'est le plus approprié qui serait appelé (celui avec les types d'entiers passés, puisque vous passez des entiers).

Eric Lippert propose des articles de blog sur les subtilités de C#.

3voto

Gagan Points 87
class Program
{
    static void Main(string[] args)
    {

        Add(3, 4,3);
    }
    public static void Add(int FN, int SN)
    {
        Console.WriteLine("Total is {0}", FN + SN);
    }
    public static void Add(int FN, int SN, int TN)
    {
        Console.WriteLine("Total is {0}", FN + SN + TN); 
    }
}

Les termes surcharge de méthode et surcharge de fonction sont utilisés de manière interchangeable. La surcharge des méthodes permet à une classe d'avoir plusieurs méthodes portant le même nom. Mais avec une signature différente. Les fonctions C# peuvent être surchargées en fonction du nombre, du type (int, float, etc.) et de la nature (Value, ref ou out) des paramètres. La signature de la méthode n'inclut pas le type de retour et le modificateur de paramètres. Il n'est donc pas possible de surcharger une fonction en fonction du type de retour et du modificateur de paramètres.

1voto

PowerUser Points 119

Erreur de compilation car la même signature de fonction est utilisée deux fois dans votre programme !

int F1(int, int); 

Float F1(int, int); 

La signature de la fonction est (nom de la fonction + nombre d'arguments + type pour chaque argument) ce qui est la même chose dans votre cas...

0voto

Andy Shellam Points 8120

L'avez-vous essayé ?

On pourrait penser qu'il devrait exécuter l'un ou l'autre :

int F1(int, int);

ou

Float F1(int, int);

Cependant, la surcharge de fonction ne fonctionne pas sur les valeurs de retour - ce sont les types de paramètres qui doivent être uniques, de sorte que cela ne se compilerait même pas.

0voto

cjk Points 27463

En C#, c'est paramètre et non la surcharge de fonctions. Vous pouvez modifier les paramètres d'entrée d'une méthode, ce qui peut conduire à un type de retour différent, mais vous ne pouvez pas spécifier un type de retour différent pour distinguer votre méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X