gpt4 book ai didi

c# - 在 C# 中从 uint[] 转换为 int[] 后调用 ToList() 的异常

转载 作者:太空狗 更新时间:2023-10-29 17:44:25 27 4
gpt4 key购买 nike

对于此代码片段,我得到一个异常 System.ArrayTypeMismatchException: Source array type cannot be assigned to destination array type:

var uints = GetArray();
if (uints is int[])
{
var list = ((int[])uints).ToList(); // fails when call ToList()
}

private Array GetArray()
{
var result = new uint[] { uint.MaxValue, 2, 3, 4, 5 };
return result;
}

然后我求助于 Jon 在 Why does "int[] is uint[] == true" in C# 中的回答,它告诉我因为 GetArray() 返回一个 Array,转换在运行时被推迟,CLR 允许这种 int[] 到 uint[ ](反之亦然) 强制转换。如果我在转换后检查值,它实际上工作正常:

foreach (var i in ((int[])units))
{
System.Console.WriteLine(i.GetType());
System.Console.WriteLine(i);
}

我会得到:

System.Int32
-1
System.Int32
2
//skipped...

但是我有点困惑为什么在调用 ToList() 时它会失败,因为下面的代码可以正常工作?

internal class Animal
{
}

internal class Cat : Animal
{
}

var cats = new Cat[] { new Cat(), new Cat() };
List<Animal> animals = ((Animal[])cats).ToList(); //no exception

最佳答案

当数组是 uint[] 时,您正试图将其转换为 int[]。这本身就很好,因为 int[]uint[] 都是 Array 类型,并且转换一个 类型的 Array 对象>uint[] 作为 int[](或反之亦然)是允许的(出于某种原因)。

当您尝试将其转换为列表时,问题就来了。该方法试图创建类型为 int 的列表,因为这是您指定的类型,但这并不是数组的实际类型。

关于c# - 在 C# 中从 uint[] 转换为 int[] 后调用 ToList() 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40604183/

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