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).
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
MSDN sagt explizit , dass das Entpacken auf einen anderen Typ ein 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 InvalidCastException wird ausgelöst, wenn der
Objekt wird nicht als ValType eingerahmt. InvalidCastException
. unbox
opcode, das tatsächlich InvalidCastException
auslöst.