我最近开始考虑这个问题,我找不到答案.以下代码按预期编译和执行
object[] test = new string[12];
Run Code Online (Sandbox Code Playgroud)
但是,我不知道为什么.
我的意思是,我们应该将string []视为object []的派生类吗?我认为在C#中,每个数组都是Array类的一个实例.如果Array是通用的,它应该是Array<T>,并且Array<string>可以分配给Array<object>它,它没有意义.我记得只有界面可以使用输入/输出关键字.
而在Java中,我不确定,但仍然觉得很奇怪.为什么当不具有超子类关系时,可能会为彼此分配不同类型的引用?
有人可以解释一下吗?
非常感谢!
这是因为引用类型数组在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的博客系列.
| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |