.NET - Wie ist explizite Umwandlung mit "as" anders (intern) von (someType) someobject, und warum?

8

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:

%Vor%

myObject wird nur null wiedergegeben, wenn someObject nicht wirklich someType ist.

Wie werden diese unterschiedlich bewertet und warum?

    
richard 21.02.2011, 07:55
quelle

2 Antworten

7

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:

     
  1. 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.
  2.   
  3. Es kann nur auf Referenztypvariablen angewendet werden, die in konvertiert werden   Referenztypen.
  4.   
  5. Verwendung als führt keine benutzerdefinierten Konvertierungen durch, wie z   implizite oder explizite Konvertierung   Operatoren, die Casting-Syntax wird   mach das.
  6.   

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).

    
Sem Vanmeenen 21.02.2011 08:01
quelle
0

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.

    
Veverke 20.07.2015 15:00
quelle

Tags und Links