很明显T[]
数组类型不是 covariant作为 T[]
的元素可以通过索引设置。
然而,一个 U[]
可以转换为 T[]
只要U
,编译器没有任何提示源自 T
.
Man[] men = new[] { new Man("Aaron"), new Man("Billy"), new Man("Charlie") };
Person[] people = (Person[])men;
在上面的代码中,出现
men
和 people
似乎确实引用了相同的 Array
目的。设置效果men[0] = new Man("Aidan")
可以在 people[0]
看到.同样尝试 people[0] = new Woman("Debbie")
结果是 ArrayTypeMismatchException
在运行时*。这是否意味着
T[]
type 实际上对每个 set
执行类型检查称呼?如果允许以这种方式转换数组,这似乎是必要的。我想我的问题只是:这怎么可能? 我很清楚
U[]
并非源自 T[]
.我也不清楚我是否可以定义我自己的以这种方式工作的类型:实际上是不变的,但行为是协变的。*尽管 CLR 显然允许数组变化,但任何语言都可能禁止在数组类型之间进行转换。但是,这种行为在 VB.NET 中似乎是相同的:
Dim men = New Man() { New Man("Aaron"), New Man("Billy"), New Man("Charlie") }
Dim people = CType(men, Person())
最佳答案
这是数组的一种特殊行为,不能以任何其他类型复制。
It is generally regarded as a mistake .
关于.net - U[] 是如何转换为 T[] 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3611422/