Möglichkeiten, um gegossene Objekte zu einem generischen Typ
In Bezug auf Gießen generic type "T", während die Durchsetzung der Typ von T
Und mit dem folgenden Beispiel
private static T deserialize<T>(string streng) where T : class
{
XmlSerializer ser = new XmlSerializer(typeof(T));
StringReader reader = new StringReader(streng);
return ser.Deserialize(reader) as T;
}
und
private static T deserialize<T>(string streng)
{
XmlSerializer ser = new XmlSerializer(typeof(T));
StringReader reader = new StringReader(streng);
return (T)ser.Deserialize(reader);
}
Ich bin es gewohnt, die object as Type
casting, so war ich ein wenig verwirrt, als ich fand, dass ich konnte nicht einfach tun, dass mit T
. Dann fand ich die Frage oben und in eine Lösung des as T
compiler-Fehler.
Aber warum ist where T : class
erforderlich, wenn Sie object as T
und nicht bei der Verwendung von (T)object
?
Was ist eigentlich der Unterschied zwischen den beiden Arten von Gießen das Objekt?
- Oh ja, danke abatishchev. Viel eleganter ist, ohne die namespaces 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil
as
bedeutet der cast fehlschlagen konnte, und null. Ohne: class
,T
könnteint
etc - das kann nicht seinnull
. Mit(T)obj
es wird einfach explodieren in einer Dusche von Funken; keine Notwendigkeit, zu behandeln, einenull
.Nebenbei (re
struct
), beachten Sie kann verwendenas
wenn bekannt ist, Sie Gießen zu einerNullable<>
- zum Beispiel:Casting mit "wie" angegeben ist: 1) führen Sie die cast, wenn es kann, und 2) zurück
null
wenn Sie es nicht können. Dies ist problematisch, mit einer unbegrenzten generische parameter (dein zweites Beispiel), da T könnte möglicherweise einen Wert geben (wieint
), Variablen, die nicht haltennull
.Wenn Ihr generische parameter gebunden ist ein Referenztyp sein (mit der
class
Einschränkung), der compiler kann die Vernunft über Ihre Art ein wenig mehr, und verstehen, dassnull
wird immer ein Gültiger Wert für den Typ T. Daher, die "wie"-style cast kann sicher verwendet werden.Soweit Betreiber
as
zurücknull
im Fehlerfall, sollten Sie die variable, eine Klasse oder eine nullable-Struktur:Mittlerweile
cast
benötigt nichts so ist, und Sie werfen kann, struct auf struct.(T)obj
wirft, wennobj
ist nicht konvertierbarT
. Sollten Sie verwenden(T)obj
wenn Sie sicher sind, dass die Konvertierung funktioniert.Und verwenden
as
zu ersetzen, ein test mitis
gefolgt von einer Besetzung. Natürlich T muss null sein(entweder ein Verweis oder einNullable<T>
) seitas
returns null on failure. Das typische Muster ist:Weiterer Unterschied ist, dass
as
funktioniert nur für eine Teilmenge der conversions. Überlastet CASTET etc werden ignoriert.Deserialize
zurückobject
weitere Konvertierungen nicht sowieso übernehmen(T)x
cast sowieso, seit er weiß, dass das Ergebnis vom TypT
.