Es wird versucht, ein boxed int in Byte zu schreiben

7

Code zur Veranschaulichung:

%Vor%

Wenn dies ausgeführt wird, generiert dies eine System.InvalidCastException ("Angegebener Cast ist nicht gültig") in Zeile "X". Eine Doppelbesetzung funktioniert:

%Vor%

Ich hätte gedacht, dass Sie in der Lage sein sollten, ein boxed int (wenn es einen Wert im Bereich 0..255 hat) in ein Byte umzuwandeln. Kann irgendjemand etwas dazu sagen?

(Dies ist in .net 2.0, falls es darauf ankommt).

    
Moe Sisko 04.06.2010, 01:33
quelle

2 Antworten

18

Der Unterschied im Verhalten, den Sie sehen, ist der Unterschied zwischen Identität und Repräsentation .

Unboxing ist eine Identität Umwandlung und eine Repräsentation erhaltende Operation. Das Umwandeln von int in byte ist jedoch representment-changing (da es zu einem möglichen Genauigkeitsverlust kommen kann).

Sie erhalten InvalidCastException , wenn Sie versuchen, die int als byte aufzulösen, da die Identität des eingerahmten Werts keine byte ist, sondern eine int . Wenn du byte b = (byte)obj schreibst, erzählst du die Laufzeit, ich weiß, dass was drin ist ist ein byte , aber was du wirklich sagen willst ist Ich denke, dass das, was da drin ist, in umgewandelt werden kann in ein byte .

Um die letztere Aussage zu machen, müssen Sie zuerst die Identität des Objekts deklarieren, was ein int ist. Dann und nur dann können Sie eine Repräsentation ändern Umwandlung in byte .

Beachten Sie, dass dies gilt, selbst wenn der Zieltyp "größer" ist - also ein Int64 . Alle expliziten Konvertierungen, bei denen der Zieltyp nicht im Vererbungsbaum des Quelltyps enthalten ist, gelten als representationsverändernd. Und da alle Typen von System.Object abgeleitet sind, kann die Definition nach nicht geändert werden.

    
Aaronaught 04.06.2010, 01:54
quelle
5

MSDN sagt explizit , dass das Entpacken auf einen anderen Typ ein InvalidCastException .

Nach meinem Verständnis ist der Typ, zu dem eine Variable nicht gebunden ist, tatsächlich ein Parameter für die zugrunde liegenden CIL-Assembly-Befehl . Es ist unbox opcode, das tatsächlich InvalidCastException auslöst.

  

InvalidCastException wird ausgelöst, wenn der   Objekt wird nicht als ValType eingerahmt.

    
Igor Zevaka 04.06.2010 01:53
quelle

Tags und Links