怎么U []可以转换为T []?

Dan*_*Tao 6 .net arrays inheritance casting covariance

很明显,T[]数组类型不是协变的,因为a的元素T[]可以通过索引来设置.

然而,只要衍生出来,U[]就可以将a转换为T[]没有编译器的任何抱怨.UT

Man[] men = new[] { new Man("Aaron"), new Man("Billy"), new Man("Charlie") };
Person[] people = (Person[])men;
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,似乎men并且people似乎确实持有对同一Array对象的引用.设置的效果men[0] = new Man("Aidan")可以在people[0].类似的尝试people[0] = new Woman("Debbie")导致一个ArrayTypeMismatchException在运行时*.

这是否意味着该T[]类型实际上在每次set调用时执行类型检查?如果允许以这种方式转换数组,这似乎是必要的.

我想我的问题只是:这怎么可能?我很清楚,U[]这并非源于此T[].我也不清楚我是否可以定义自己的类型以这种方式工作:实际上不变的但是行为协变.


*虽然CLR显然允许数组差异,但任何语言都不允许在数组类型之间进行转换.但是,似乎这种行为在VB.NET中是相同的:

Dim men = New Man() { New Man("Aaron"), New Man("Billy"), New Man("Charlie") }
Dim people = CType(men, Person())
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 7

这是数组的特殊行为,不能以任何其他类型复制.

一般认为这是一个错误.