c# - 在C#和Java中,Object[]和String[]之间的关系是什么?

标签 c# java arrays

最近开始思考这个问题,却找不到答案。 以下代码按预期编译并执行

object[] test = new string[12];

但是,我不知道为什么。

我的意思是,我们应该将 string[] 视为 object[] 的派生类吗? 我认为在 C# 中,每个数组都是 Array 类的一个实例。如果数组是通用的,它应该是 Array<T> ,和Array<string>可以分配给Array<object> ,这没有意义。我记得只有接口(interface)可以使用in/out关键字。

而在Java中,我不确定,但还是感觉很奇怪。为什么不同类型的引用在没有超子类关系的情况下可以互相赋值?

有人可以解释一下吗?

非常感谢!

最佳答案

这是因为引用类型数组在 Java 和 C# 中都支持协变。这也意味着每次写入引用类型数组时都必须在执行时进行检查,以确保不会向其中写入错误类型的元素:(

不要忘记 Java 和 C#(以及一般的 .NET)一开始都没有泛型。如果他们从一开始就有泛型,生活可能会有所不同。

请注意,Java 和 C# 现在都支持通用方差,但方式相当不同。例如,在 C# 4 中,您可以编写:

IEnumerable<string> strings = // Get some string sequence here
IEnumerable<object> objects = strings;

但是你不能

IList<string> strings = // Get some string list here
// Compile-time error: IList<T> isn't covariant in T
IList<object> objects = strings;

这并不安全,因为您可以添加IList<T>以及从中获取元素。

这是一个很大的话题 - 有关更多详细信息,请参阅 Eric Lippert's blog series .

关于c# - 在C#和Java中,Object[]和String[]之间的关系是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3881512/

相关文章:

c# - C# 中的 Google 网站站长工具 API

Java/MySql - 获取一行并将其转换为 arraylist<String>

java - 初始化数组: java. lang.NullPointerException

javascript - Excel 文件无法在 MVC4 中使用 AJAX 下载

c# - 将变量设置为包含方法的名称

c# - MVC4 中的 Html.TextBox 和 Html.Editor 有什么区别?

java - Spring Boot 管理服务器 : App Specific Email Notification

java - HashMap 足够快吗?

java - 为什么 getNextZipEntry 会跳过几个文件的根目录?

java - java中如何实例化一个成员类的数组