Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine generische Methode ist eine Methode, die wie folgt mit Typparametern deklariert wird:
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
Das folgende Codebeispiel zeigt eine Möglichkeit, die Methode mithilfe int
des Typarguments 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 auch das Typargument weglassen, und der Compiler leitet es ab. Der folgende Aufruf zu Swap
entspricht dem vorherigen Aufruf.
Swap(ref a, ref b);
Die gleichen Regeln für typinferenz gelten für statische Methoden und Instanzmethoden. Der Compiler kann die Typparameter basierend auf den von Ihnen übergebenen Methodenargumenten ableiten; er kann die Typparameter jedoch nicht nur aus einer Einschränkung oder einem Rückgabewert ableiten. Daher funktioniert typinference nicht mit Methoden ohne Parameter. Die Typinferenz erfolgt zur Kompilierzeit, bevor der Compiler versucht, überladene Methodensignaturen aufzulösen. Der Compiler wendet Typinferenzlogik auf alle generischen Methoden an, die denselben Namen haben. Im Überladungsauflösungsschritt enthält der Compiler nur die generischen Methoden, für die die Typ-Ableitung erfolgreich war.
In einer generischen Klasse können nicht generische Methoden wie folgt auf die Parameter des Typtyps auf Klassenebene zugreifen:
class SampleClass<T>
{
void Swap(ref T lhs, ref T rhs) { }
}
Wenn Sie eine generische Methode definieren, die die gleichen Typparameter wie die enthaltende Klasse akzeptiert, generiert der Compiler warnung CS0693 , da das für das innere Argument angegebene Argument innerhalb des Methodenbereichs das für T
das äußere Argument T
bereitgestellte ausgeblendet. Wenn Sie die Flexibilität benötigen, eine generische Klassenmethode mit anderen Typargumenten als den beim Instanziieren der Klasse bereitgestellten Methoden aufzurufen, sollten Sie einen anderen Bezeichner für den Typparameter der Methode angeben, wie im GenericList2<T>
folgenden Beispiel gezeigt.
class GenericList<T>
{
// CS0693.
void SampleMethod<T>() { }
}
class GenericList2<T>
{
// No warning.
void SampleMethod<U>() { }
}
Verwenden Sie Einschränkungen, um speziellere Vorgänge für Typparameter in Methoden zu aktivieren. Diese Version von Swap<T>
, jetzt benannt SwapIfGreater<T>
, 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 für mehrere Typparameter überladen werden. Die folgenden Methoden können sich beispielsweise 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#-Sprachspezifikation
Weitere Informationen erhalten Sie unter C#-Sprachspezifikation.