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)
| 归档时间: |
|
| 查看次数: |
174 次 |
| 最近记录: |