最近开始思考这个问题,却找不到答案。 以下代码按预期编译并执行
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/