The CLR has more generous casting rules than C# has. Apparently, the CLR allows to convert between arrays of enums if the underlying type has the same size for both types. In the question that I linked the case was (sbyte[])(object)(byte[])
which is similarly surprising.
This is in the ECMA spec Partition I I.8.7 Assignment compatibility.
underlying types – in the CTS enumerations are alternate names for existing types
(§I.8.5.2), termed their underlying type. Except for signature matching (§I.8.5.2)
III.4.3 castclass says
If the actual type (not the verifier tracked type) of obj is verifier-assignable-to the type typeTok
the cast succeeds
castclass
is the instruction that the C# compiler uses to perform this cast.
The fact, that the enum members are the same in your example has nothing to do with the problem. Also note, that no new object is being created. It really is just a cast of the object reference.