C# - Generische Methode, kann nicht implizit konvertiert
Habe ich den folgenden code:
public static T GetCar<T>() where T : ICar
{
T objCar = default(T);
if (typeof(T) == typeof(SmallCar)) {
objCar = new SmallCar("");
} else if (typeof(T) == typeof(MediumCar)) {
objCar = new MediumCar("");
} else if (typeof(T) == typeof(BigCar)) {
objCar = new BigCar("");
}
return objCar;
}
- Und das ist der Fehler den ich erhalte: Cannot implicitly convert type 'Test.Cars' to 'T'
Was vermisse ich hier? Alle Auto-Typen implementieren das ICar-Schnittstelle.
Dank
- Es wird leichter sein, zu helfen, wenn Sie nach der Prüfung.PKW-code zusammen Nutzung in Frage.
- mögliche Duplikate von implict Typumwandlung in generische Methode
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht konvertieren
T
aufgrund der Tatsache, dass T nicht zur Kompilierzeit bekannt ist.Wenn Sie möchten, um Ihren code zu arbeiten, können Sie ändern Sie den Rückgabetyp zu
ICar
und entfernen Sie die generischeT
zurück geben.Kann man auch werfen, um
T
. Dies würde auch funktionieren.Wenn Sie nur mit dem Standard-Konstruktor können Sie auch constain auf
new()
und verwendennew T()
um Ihren code zu arbeiten.Proben
Darsteller:
New-Einschränkung:
SmallCar
. Die Einschränkung sagt dem compiler, dass jeder Typ in der Methode als generische parameter muss einen parameterlosen Konstruktor ( new constraint ) und implementieren müssen, die ArtICar
. Die Methode Körper jetzt erstellt eine neue Instanz vonT
und kümmert sich nicht welche Art es tatsächlich ist. Aber diese Methode ist irgendwie begrenzt, da es noch nicht möglich zu definieren, die möglichen Parameter für die Methode. Wenn Sie möchten, übergeben Sie Parameter, die Sie verwenden können, dieActivator
Klasse.new()
contraint: msdn.microsoft.com/en-us/library/sd2w2ew5.aspxDein code ist illegal, weil, während Sie möglicherweise testen und wissen, dass Ihre T ist BigCar oder einige andere solche Typ, der compiler kann nicht wissen, dass es im Voraus und somit der code ist illegal. Basierend auf Ihrer Nutzung gegeben haben, könnte
Den
new()
Einschränkung ermöglicht das aufrufen des Standard - (parameterlosen) Konstruktor für ein Typ ist.Können Sie den code vereinfachen
Generika ist ein run-time-Konzept. Informationen zu den verwendeten Typen in einer generischen Datentyp-unabhängig davon, ob es sich um ein Wert-oder Referenz-Typ erhalten werden können, die zur Laufzeit über Reflexion.
Wenn ein code mit T ist zusammengestellt in MSIL es nur identifiziert es als eine Art parameter. Deshalb generischen Typ-parameter T nicht bekannt ist zur compile-Zeit.