14 Stimmen

Überladen von Funktionen

Nehmen wir an, ich habe diese drei Methoden definiert:

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

und ich rufe hier die Methode F1 auf:

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

Welche Methode wird er aufrufen und warum?

27voto

Oded Punkte 475566

Die erste und die dritte Funktion werden nicht im gleichen Namensraum kompiliert.

Dies liegt daran, dass Funktionssignaturen nach Typ und Anzahl der Parameter unterschieden werden, und diese sind gleich. Rückgabetypen werden nicht als Teil der Methodensignatur betrachtet.

Wenn Sie nur den ersten und zweiten (oder zweiten und dritten) im Namensraum hätten, würde der am besten geeignete aufgerufen werden (der mit den übergebenen Ganzzahltypen, da Sie Ganzzahlen übergeben).

Eric Lippert hat einige großartige Blogeinträge über die Feinheiten von C#.

3voto

Gagan Punkte 93
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); 
    }
}

Die Begriffe Methodenüberladung und Funktionsüberladung werden austauschbar verwendet. Das Überladen von Methoden ermöglicht es einer Klasse, mehrere Methoden mit demselben Namen zu haben. Aber mit unterschiedlicher Signatur. C#-Funktionen können basierend auf der Anzahl, dem Typ (int, float etc.) und der Art (Value, ref oder out) der Parameter überladen werden. Die Signatur der Methode enthält keinen Rückgabetyp und keinen Parameter-Modifikator. Es ist also nicht möglich, eine Funktion auf der Grundlage des Rückgabetyps und des Modifikators params zu überladen.

1voto

Kompilierungsfehler, da dieselbe Funktionssignatur zweimal in Ihrem Programm verwendet wird!

int F1(int, int); 

Float F1(int, int); 

Funktionssignatur ist (Name der Funktion + Anzahl der Argumente + Typ für jedes Argument) was auch in Ihrem Fall der Fall ist...

0voto

Andy Shellam Punkte 14907

Haben Sie es ausprobiert?

Man sollte meinen, dass es beides ausführen sollte:

int F1(int, int);

o

Float F1(int, int);

Das Überladen von Funktionen funktioniert jedoch nicht bei Rückgabewerten - es sind die Parametertypen, die eindeutig sein müssen, so dass dies nicht einmal kompiliert werden kann.

0voto

cjk Punkte 44394

In C# lautet sie Parameter Überladung, nicht Funktionsüberladung. Sie können die Eingabeparameter für eine Methode ändern, was zu einem anderen Rückgabetyp führen kann, aber Sie können nicht einen anderen Rückgabetyp angeben, um Ihre Methode zu unterscheiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X