Неге бұл typecast қатені тудырады?

Бұл күткендегідей жұмыс істейді:

byte b = 7;
var i = (int)b;

Бұл InvalidCastException қояды:

byte b = 7;
object o = b;
var i = (int)o;

Неге негізгі код әлі де байт болғанда, object элементінен сәтсіздікке ұшырайды?

6
Бұл мәселе мынаны қарастырады: stackoverflow.com/questions/5588073/… - атап айтқанда, Эрик Липперттің жауабы - жақсы оқу.
қосылды автор Matt Greer, көзі
@MattGreer Бұл менің қызығушылығыма дәл жауап береді.
қосылды автор jelbourn, көзі

3 жауаптар

байт нақты кодты int түрлендіргендіктен, object дегенді білдірмейді.

Егер сіз компиляторға object шынымен байт болса, онда ол сізге int </< код>.

byte b = 7;
object o = b;
var i = (int)((byte)o);

Әдебиеттер:

Casting and Type Conversions
byte

6
қосылды
тері, тек жауап беруге келеді: Р
қосылды автор Rob, көзі

Бұл CLR-ді бокс және қораптан босату арқылы туындады. Мән түрін объект ретінде қарастыратын кезде, CLR автоматты түрде осы мән түрін Объект ішіндегі жолмен жояды. CLR тек MSDN :

Unboxing

Unboxing is an explicit conversion from the type object to a value type or from an interface type to a value type that implements the interface. An unboxing operation consists of:

  • Checking the object instance to make sure that it is a boxed value of the given value type.

  • Copying the value from the instance into the value-type variable.

object o = b; Causes the CLR to created a boxed byte and stores it in o as being an Object. var i = (int)o; then attempts to unbox the boxed byte into an int. This causes an exception as the boxed type (byte) and the value type (int) differ.

1
қосылды

айналдыру дейін оны бүтін санға дейін алдымен нысаннан байтты алуыңыз керек.

Сол сияқты бірнәрсе:

var i = (int)(byte)o;
0
қосылды