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

LLS*_*LLS 2 c# java arrays

我最近开始考虑这个问题,我找不到答案.以下代码按预期编译和执行

object[] test = new string[12];
Run Code Online (Sandbox Code Playgroud)

但是,我不知道为什么.

我的意思是,我们应该将string []视为object []的派生类吗?我认为在C#中,每个数组都是Array类的一个实例.如果Array是通用的,它应该是Array<T>,并且Array<string>可以分配给Array<object>它,它没有意义.我记得只有界面可以使用输入/输出关键字.

而在Java中,我不确定,但仍然觉得很奇怪.为什么当不具有超子类关系时,可能会为彼此分配不同类型的引用?

有人可以解释一下吗?

非常感谢!

Jon*_*eet 5

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

不要忘记Java和C#(以及一般的.NET)都是在没有泛型的情况下开始的.如果他们已经有仿制药,开始时,生命可能已经有所不同.

请注意,Java和C#现在都支持泛型差异,但方式却截然不同.所以例如在C#4中你可以写:

IEnumerable<string> strings = // Get some string sequence here
IEnumerable<object> objects = strings;
Run Code Online (Sandbox Code Playgroud)

但你不能

IList<string> strings = // Get some string list here
// Compile-time error: IList<T> isn't covariant in T
IList<object> objects = strings;
Run Code Online (Sandbox Code Playgroud)

这不安全,因为您可以添加到一个IList<T>以及从中获取项目.

这是一个很大的话题 - 有关详细信息,请参阅Eric Lippert的博客系列.