Generische Methoden (C#-Programmierhandbuch)Generic Methods (C# Programming Guide)

Bei einer generischen Methode handelt es sich um eine mit Typparametern deklarierte Methode, wie folgt:A generic method is a method that is declared with type parameters, as follows:

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:The following code example shows one way to call the method by using int for the type argument:

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.You can also omit the type argument and the compiler will infer it. Der folgende Aufruf von Swap bewirkt das gleiche wie der vorherige Aufruf:The following call to Swap is equivalent to the previous call:

Swap(ref a, ref b);

Für statische Methoden und Instanzmethoden gelten die gleichen Typrückschlussregeln.The same rules for type inference apply to static methods and instance methods. 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.The compiler can infer the type parameters based on the method arguments you pass in; it cannot infer the type parameters only from a constraint or return value. Infolgedessen ist ein Typrückschluss bei Methoden ohne Parameter nicht möglich.Therefore type inference does not work with methods that have no parameters. Der Typrückschluss tritt beim Kompilieren auf, bevor der Compiler versucht, die Signaturen von überladenen Methoden aufzulösen.Type inference occurs at compile time before the compiler tries to resolve overloaded method signatures. Der Compiler wendet Typrückschlusslogik auf alle generischen Methoden gleichen Namens an.The compiler applies type inference logic to all generic methods that share the same name. Im Schritt zur Überladungsauflösung schließt der Compiler nur die generischen Methoden ein, bei denen der Typrückschluss erfolgreich war.In the overload resolution step, the compiler includes only those generic methods on which type inference succeeded.

Innerhalb einer generischen Klasse können nicht generische Methoden die Typparameter auf Klassenebene folgendermaßen zugreifen:Within a generic class, non-generic methods can access the class-level type parameters, as follows:

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 ausgeblendet wird.If you define a generic method that takes the same type parameters as the containing class, the compiler generates warning CS0693 because within the method scope, the argument supplied for the inner T hides the argument supplied for the outer T. 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.If you require the flexibility of calling a generic class method with type arguments other than the ones provided when the class was instantiated, consider providing another identifier for the type parameter of the method, as shown in GenericList2<T> in the following example.

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.Use constraints to enable more specialized operations on type parameters in methods. Die Version von Swap<T>, jetzt SwapIfGreater<T> genannt, kann nur mit Typargumenten verwendet werden, die IComparable<T> implementieren.This version of Swap<T>, now named SwapIfGreater<T>, can only be used with type arguments that implement IComparable<T>.

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.Generic methods can be overloaded on several type parameters. Beispielsweise können sich folgende Methoden alle in derselben Klasse befinden:For example, the following methods can all be located in the same class:

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

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation.For more information, see the C# Language Specification.

Siehe auchSee Also

System.Collections.Generic
C#-ProgrammierhandbuchC# Programming Guide
Einführung in GenerikaIntroduction to Generics
MethodenMethods