Generische Methoden (C#- Programmierleitfaden)
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 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 akzeptiert, gibt der Compiler die Warnung CS0693 aus, weil innerhalb des Gültigkeitsbereichs der Methode das Argument für das innere T
das Argument für das innere T
verdeckt. 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. Die 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>() { }
Sie können den Typparameter auch als Rückgabetyp einer Methode verwenden. Das folgende Codebeispiel zeigt eine Methode, die ein Array vom Typ T
zurückgibt:
T[] Swap<T>(T a, T b)
{
return [b, a];
}
C#-Programmiersprachenspezifikation
Weitere Informationen erhalten Sie unter C#-Sprachspezifikation.