Unterschied zwischen Casting in C # und VB.NET

8

Der folgende Code funktioniert in C # einwandfrei.

%Vor%

Aber dieser Code stürzt mit einer OverflowException in VB.NET ab.

%Vor%

Beide Code-Snippets scheinen mir gleich zu sein. Was ist der Unterschied und wie kann ich den C # -Code in VB.NET konvertiert bekommen?

    
Ignacio Soler Garcia 09.12.2009, 14:06
quelle

7 Antworten

11

Von MSDN :

Damit die Operation arithmetic, casting oder conversion eine OverflowException auslöst, muss die Operation in einem überprüften Kontext ausgeführt werden. Standardmäßig werden arithmetische Operationen und Überläufe in Visual Basic überprüft. in C # sind sie nicht. Wenn die Operation in einem ungeprüften Kontext auftritt, wird das Ergebnis abgeschnitten, indem alle Bits höherer Ordnung verworfen werden, die nicht in den Zieltyp passen.

BEARBEITEN: Wenn Sie Code von C # nach VB.NET portieren möchten, könnten Sie an Unterschieden zwischen ihnen . Vergleichen Sie auch die Compilereinstellungen und geben Sie explizit an, dass sie den Standardeinstellungen in C # entsprechen (falls erforderlich) .

    
Roman Boiko 09.12.2009, 14:19
quelle
8

Zuerst oben: Mein Verständnis davon ist, dass CType (b, Int16) nicht dasselbe ist wie (Int16) b. Einer ist eine Umwandlung des Typs (CType) und der andere ist eine Besetzung. (Int16) b entspricht DirectCast (b, Int16) und nicht CType (b, Int16).

Der Unterschied zwischen den beiden (wie in MSDN angegeben) besteht darin, dass CType erfolgreich ist, solange eine gültige Konvertierung vorhanden ist. DirectCast erfordert jedoch, dass der Laufzeittyp des Objekts identisch ist, und daher nur Sie 're doing sagt dem Compiler zur Entwurfszeit, dass dieses Objekt von diesem Typ ist, anstatt es an diesen Typ zu konvertieren.

Siehe: Ссылка

Das zugrunde liegende Problem ist jedoch, dass Sie versuchen, eine 32-Bit-Ganzzahl in eine 16-Bit-Ganzzahl zu konvertieren, die ... [Ich vermisse das Wort, das ich brauche, vielleicht kann jemand es hier für mich einfügen] verlustreich. Konvertieren von 16 Bit zu 32 Bit ist erlaubt, weil es verlustfrei ist, die Umwandlung von 32 Bit zu 16 Bit ist undefiniert. Für warum es in C # funktioniert, können Sie @ Roman's Antwort sehen - es bezieht sich auf die Tatsache, dass C # den Überlauf nicht überprüft.

Der resultierende Wert von &H7FFFFFFF And &HFFFF führt zu UInt16.MaxValue (65535) UInt16 läuft von 0 bis 65535, Sie versuchen, das in Int16 zu stopfen, das von -32768 bis 32767 läuft, was Sie nicht sehen können zur Arbeit gehen. Auch die Tatsache, dass dieser Wert in ein UInt16 passen könnte, ist zufällig, das Hinzufügen von zwei 32-Bit-Ganzzahlen und der Versuch, sie in eine 16-Bit-Ganzzahl (kurz) zu stopfen, würde häufig einen Überlauf verursachen und würde daher sagen, dass dies eine inhärent gefährliche Operation ist / p>     

BenAlabaster 09.12.2009 14:09
quelle
2

Haben Sie versucht, DirectCast(b, Int16) zu verwenden? CType ist nicht identisch mit einem C # -Auftrag.

Hier ist ein Artikel, der die Leistung von DirectCast und CType ebenfalls vergleicht Gehen Sie in die Details, wenn beides verwendet werden sollte.

    
Daniel May 09.12.2009 14:08
quelle
1

Ссылка

Zusammenfassung:

Zum unsignierten Typ: tun Sie einfach Und Operator oder 2. Methode.

%Vor%

Vorzeichenbehafteter Typ: linke Verschiebung n Bits, dann rechte Verschiebung n Bits, was das vorzeichenbehaftete Bit erweitert. n = (sizeof (type1) - sizeof (type2)) * 8 oder VB: benutze Len (New type) anstelle von sizeof (type)

%Vor%

Sie finden die Details unter dem folgenden Link.

    
user531952 06.12.2010 07:59
quelle
0
%Vor%     
serhio 09.12.2009 14:17
quelle
0

Sie können diese Art von Überlauf mit einer Struktur abschneiden.

%Vor%

...

%Vor%     
Simon 03.03.2010 04:17
quelle
0

Ich bin auf diese Frage gestoßen, als ich nach einer Lösung suchte, um eine Short zu konvertieren und das Overflow-Ergebnis ohne den Overflow-Fehler zu bekommen. Ich habe hier eine Lösung gefunden:

Ссылка

etwa auf halber Seite der Seite ist dies:

  

Der alte, VB "Richtige" Trick von "side-stepping" zu Hexadezimal und   wieder funktioniert es immer noch!

%Vor%

es scheint ziemlich glatt zu funktionieren!

    
user3033282 23.09.2015 15:36
quelle

Tags und Links