Why can I not modify the result of an unboxing conversion?
struct Point { public int x; public int y; } void Main() { Point p; p.x = 1; p.y = 1; Object o = p; ((Point) o).x = 4; // error ((Point) o).x = 5; // error ((Point) o).x = 6; // error p = (Point) o // expect 6 } Why doesn't it compile to ldloc.1 // o unbox Point ldc.i4.4 stfld Point.x Where C++ CLI allows it. For those who don't know, unbox is not required to create a copy of value types , instead it pushes a pointer to the value on to the stack. Only assignment would create a copy. Because of how value types work, the boxed Point is a copy of the original, and "unboxing" it by casting back to