.net - U[] 是如何转换为 T[] 的?

标签 .net arrays inheritance casting covariance

很明显T[]数组类型不是 covariant作为 T[] 的元素可以通过索引设置。

然而,一个 U[]可以转换为 T[]只要U,编译器没有任何提示源自 T .

Man[] men = new[] { new Man("Aaron"), new Man("Billy"), new Man("Charlie") };
Person[] people = (Person[])men;

在上面的代码中,出现 menpeople似乎确实引用了相同的 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/

相关文章:

c++ - 为什么抽象类的实现看不到重载的纯虚函数?

c++ - 限制对 C++ 中特定类的方法访问

c# - 为什么 SpellCheck 总是将附加词典(utf-8、带 BOM 的 utf-8、UTF-16)中的单词标记为错误?

java - 如何在Java中创建通用数组?

.net - SSIS - 从文件名中获取子字符串并插入到数据库表中

python - python 代码在数组中不起作用

javascript - 我可以在JavaScript中选择多维HTML数组作为多维数组吗?

linux - 从另一个 shell 脚本中只调用一个函数

c# - 在 service .net core 中获取 appsettings.json 值

c# - 在单声道中使用 c# 驱动程序比较 mongo 集合的两个字段