9.4 Generische Methoden
Generische Typen sind nicht nur im Zusammenhang mit Klassen möglich, sondern auch mit Methoden. Dabei ist es nicht zwingend notwendig, dass die Typparameter einer Methode denen der Klasse entsprechen:
class Demo<T> {
public void DoSomething<K>(K param) { [...] }
}
Im Gültigkeitsbereich der Klasse ist in diesem Fall der Typ »T« bekannt, »K« nur innerhalb der Methode. Sie dürfen generische, methodenspezifische Typparameter auch angeben, wenn die Klasse selbst keine definiert:
class Demo {
public void DoSomething<T>(T param) { [...] }
}
Der Aufruf einer Methode mit generischen Typparametern ist sehr einfach. Sie instanziieren in gewohnter Weise zuerst die Klasse und rufen die Methode unter Angabe des gewünschten konkreten Datentyps auf:
Demo<string> @object = new Demo<string>();
@object.DoSomething<int>(25);
Sie können es sogar noch kürzer formulieren, wenn Sie auf die Typangabe beim Methodenaufruf verzichten. Der C#-Compiler wird in diesem Fall die richtige Schlussfolgerung ziehen. Daher ist auch der folgende Aufruf gleichwertig:
@object.DoSomething(25);
Generische Typparameter und Constraints können sowohl für Instanzmethoden als auch für statische Methoden festgelegt werden.
Dass Felder auf Klassenebene und Methodenparameter gleichnamig sein dürfen, ist Ihnen bekannt. Diese Freizügigkeit haben Sie mit generischen Typparametern nicht: Ein Platzhalter, der auf Klassenebene angegeben ist, darf für eine Methode nicht mehr verwendet werden, da der C#-Compiler nicht in der Lage ist, diese Doppeldeutigkeit aufzulösen.
class Demo<T> {
// fehlerhafter Typparameter
public void DoSomething<T>(T obj) { [...] }
}
Richtig müsste es lauten:
class Demo {
public void DoSomething<T>(T obj) { [...] }
}
oder
class Demo<T> {
public void DoSomething(T obj) { [...] }
}
9.4.1 Methoden und Constraints
Muss der generische Typparameter einer Methode bestimmten Bedingungen genügen, legen Sie einen Constraint fest. Die Syntax entspricht der der Constraints einer Klasse. Allerdings ist es nicht möglich, einen Constraint für einen generischen Typparameter einer Methode zu definieren, der bereits auf Klassenebene festgelegt ist.
public void DoSomething<T>(T param) where T: IComparable {
[...]
}
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.