It compiles because an “object” can be anything, so it can be a reference to an array of an object. The code below, using strings to make the difference a little clearer, can help. So:
List<string> myStrings = new List<string>() { "aa", "bb" };
string[] myStringsArray = myStrings.ToArray();
object stillMyStringsArray = (object)myStringsArray;
string[] anotherArray = myStrings.ToArray();
object anotherArrayAsObject = (object)anotherArray;
object myStringArrays = new object[] { stillMyStringsArray, anotherArrayAsObject };
object myOriginalStringsArrayAsObject = ((object[])myStringArrays)[0];
string[] myOriginalStringsArray = (string[])myOriginalStringsArrayAsObject;
Essentially, an object can always be a reference to anything, even an array of objects. The object does not care what is placed in it, so at the very end of the code we have an array of strings. Run this code in Visual Studio, drop some breakpoints and follow through it. It, I hope, will help you understand why the code you specified is valid =)