gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:37:11 24 4
gpt4 key购买 nike

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

object[] test = new string[12];

但是,我不知道为什么。

我的意思是,我们是否应该将 string[] 视为 object[] 的派生类?我认为在 C# 中,每个数组都是 Array 类的一个实例。如果 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com