Ich verstehe, dass wenn Sie einen expliziten Cast wie folgt verwenden:
%Vor% Sie können eine ungültige Cast Ausnahme erhalten, wenn someobject
nicht wirklich someType
ist.
Ich verstehe auch, dass wenn Sie mit as
wie folgt wirken:
myObject
wird nur null
wiedergegeben, wenn someObject
nicht wirklich someType
ist.
Wie werden diese unterschiedlich bewertet und warum?
John Skeet hat eine C # -Faq , in der er die Unterschiede zwischen den beiden Betreibern erläutert. Siehe Abschnitt "Was ist der Unterschied zwischen der Verwendung der Cast-Syntax und des as-Operators?".
Quote:
Die Verwendung des as-Operators unterscheidet sich von a In C # auf drei wichtige Arten einbetten:
- Gibt eine Null zurück, wenn die Variable, die Sie konvertieren möchten, ist nicht vom angeforderten Typ oder in seiner Vererbungskette, anstatt zu werfen eine Ausnahme.
- Es kann nur auf Referenztypvariablen angewendet werden, die in konvertiert werden Referenztypen.
- Verwendung als führt keine benutzerdefinierten Konvertierungen durch, wie z implizite oder explizite Konvertierung Operatoren, die Casting-Syntax wird mach das.
Es gibt tatsächlich zwei komplett verschiedene in IL definierte Operationen Diese behandeln diese beiden Schlüsselwörter (die Castclass und Isinst Anweisungen) - es ist nicht nur "syntaktischer Zucker" geschrieben von C #, um das anders zu machen Verhalten. Der as-Operator scheint zu etwas schneller in v1.0 und v1.1 von Microsofts CLR im Vergleich zum Casting (Auch in Fällen, in denen es keine gibt ungültige Casts, die stark würden geringere Wurfleistung durch Ausnahmen).
Jahre sind vergangen ... aber vor wenigen Minuten bin ich auf ein praktisches Beispiel gestoßen, von dem ich denke, dass es erwähnenswert ist - den Unterschied zwischen den beiden:
Sieh dir das an:
%Vor%Untere Zeile: GenericCaster2 funktioniert nicht mit Strukturtypen. GenericCaster wird.