Okay, I've taken the liberty to assume that you're referring to an array of arrays and not a 2d array as otherwise that cast will not compile
Multidimensional Array [][] vs [,]
to be fair that is pretty confusing!
When it comes to figuring out how code is working it never hurts just to have a fiddle. I knocked up some dummy code to show that all your doing is creating a new reference to the memory and not creating a copy.
object[][] obj = new object[5][]; //Delcare Jagged array
obj[0] = new object[] { 1, 1, 1 };
obj[1] = new object[] { 2, 2, 2 };
obj[2] = new object[] { 3, 3, 3 };
obj[3] = new object[] { 4, 4, 4 };
obj[4] = new object[] { 5, 5, 5 }; //Fill up with stuff
Console.WriteLine("{0}", obj[2][0]); // prints 3
object[] newobj = (object[])obj; // Declare array of objects and cast
newobj[2] = new object[] { 9, 9, 9 }; // update using the new refrence
Console.WriteLine("{0}", obj[2][0]); // print from old reference, now prints 9
Console.WriteLine("{0}", ((object[])newobj[2])[0]); // print from new reference, prints 9 but requires a cast
Console.WriteLine("{0}", newobj[2][0]); // Error, cannot apply indexing with [] to an expression of type object
So you can see that updating the array from the new 1d reference still updates the underlying memory which the original reference still points to. However, as you've insisted to the compiler that the second reference is to be a 1d array you can no longer use the [][] syntax, or at least not without a cast back again
You can also use a tool such as ILSpy to see how the code compiles. In this case our function declares two local types at the top
.locals init (
[0] object[][],
[1] object[]
)
but when the cast takes place, all the IL does is pushes the value (reference) of variable 0 onto the stack and pops it into variable 1, simple as that!
IL_00ca: ldloc.0 //push 0
IL_00cb: stloc.1 //pop 1