gpt4 book ai didi

c# - 为什么某些值类型的数组之间的强制转换似乎会破坏类型安全?

转载 作者:行者123 更新时间:2023-11-30 12:25:34 25 4
gpt4 key购买 nike

<分区>

以下代码:

object array = new int[] {-1};
Console.WriteLine("array is uint[]: {0}", array is uint[]);
Console.WriteLine("array[0]: {0:X}", ((uint[])array)[0]);

打印以下内容,没有任何错误:

array is uint[]: True
array[0]: FFFFFFFF

这对我来说似乎很奇怪,因为它似乎破坏了类型安全。执行以下操作也是编译时错误:

int[] array = {-1};
uint[] test = (uint[])array;

这种不一致从何而来?为什么 CLR 是这样实现的?

请注意,我不认为这与数组协方差是一回事。在数组协变中,转换是允许的,因为存在隐式引用转换;这不是这里的情况,其中两种类型都是值类型并且它们之间只有显式转换。
对于数组协变,运行时也会在某些情况下抛出异常(当赋值没有意义时)。在这种情况下,运行时不会抛出异常,即使将 test[0] 分配给 Int32 范围之外的值也是如此。

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