Freigeben über


Generische Methoden (C#-Programmierhandbuch)

Aktualisiert: November 2007

Bei einer generischen Methode handelt es sich um eine mit Typparametern deklarierte Methode, wie folgt:

static void Swap<T>(ref T lhs, ref T rhs)
{
    T temp;
    temp = lhs;
    lhs = rhs;
    rhs = temp;
}

Im folgenden Codebeispiel wird eine Möglichkeit gezeigt, die Methode mit int für das Typargument aufzurufen:

public static void TestSwap()
{
    int a = 1;
    int b = 2;

    Swap<int>(ref a, ref b);
    System.Console.WriteLine(a + " " + b);
}

Sie können das Typargument auch weglassen, dann wird es vom Compiler abgeleitet. Der folgende Aufruf von Swap bewirkt das gleiche wie der vorherige Aufruf:

Swap(ref a, ref b);

Für statische Methoden und Instanzmethoden gelten die gleichen Typrückschlussregeln. Der Compiler kann Typparameter auf der Grundlage der übergebenen Methodenargumente ableiten. Eine Einschränkung oder ein Rückgabewert genügen ihm zur Ableitung des Typparameters nicht. Infolgedessen ist ein Typrückschluss bei Methoden ohne Parameter nicht möglich. Der Typrückschluss tritt beim Kompilieren auf, bevor der Compiler versucht, die Signaturen von überladenen Methoden aufzulösen. Der Compiler wendet Typrückschlusslogik auf alle generischen Methoden gleichen Namens an. Im Schritt zur Überladungsauflösung schließt der Compiler nur die generischen Methoden ein, bei denen der Typrückschluss erfolgreich war.

Innerhalb einer generischen Klasse können nicht generische Methoden auf die Typparameter auf Klassenebene folgendermaßen zugreifen:

class SampleClass<T>
{
    void Swap(ref T lhs, ref T rhs) { }
}

Wenn eine generische Methode definiert wird, die die gleichen Typparameter wie die übergeordnete Klasse verwendet, gibt der Compiler die Warnung CS0693 aus, weil innerhalb des Gültigkeitsbereichs der Methode das Argument für das äußere T durch das Argument für das innere T verdeckt wird. Falls Sie die Flexibilität benötigen, eine generische Klassenmethode mit anderen als den bei der Instanziierung der Klasse bereitgestellten Typargumenten aufrufen zu können, sollten Sie einen anderen Bezeichner für den Typparameter der Methode erwägen, wie in GenericList2<T> im folgenden Beispiel dargestellt.

class GenericList<T>
{
    // CS0693
    void SampleMethod<T>() { }
}

class GenericList2<T>
{
    //No warning
    void SampleMethod<U>() { }
}

Verwenden Sie Einschränkungen, um spezialisiertere Operationen bei Typparametern in Methoden zu ermöglichen. Diese Version von Swap<T>, jetzt SwapIfGreater<T> genannt, kann nur mit Typargumenten verwendet werden, die IComparable<T> implementieren.

void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
    T temp;
    if (lhs.CompareTo(rhs) > 0)
    {
        temp = lhs;
        lhs = rhs;
        rhs = temp;
    }
}

Generische Methoden können auf mehrere Typparameter überladen werden. Beispielsweise können sich folgende Methoden alle in derselben Klasse befinden:

void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }

C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie unter C#-Programmiersprachenspezifikation.

Siehe auch

Konzepte

C#-Programmierhandbuch

Referenz

Einführung in Generika (C#-Programmierhandbuch)

System.Collections.Generic

Methoden (C#-Programmierhandbuch)