gpt4 book ai didi

.net - 为什么 IEnumerable 的这个 ToArray() 扩展方法会抛出 ArrayTypeMismatchException?

转载 作者:行者123 更新时间:2023-12-04 17:05:37 24 4
gpt4 key购买 nike

为什么下一个示例会引发 System.ArrayTypeMismatchException?

New Int16(){4,5,6}.Cast(of UInt16).ToArray()

我希望这一行返回一个包含 4,5 和 6 的 UInt16 数组。

提前致谢。

最佳答案

这是 Cast 中的一个错误。或 ToArray ,海事组织。这个答案中的代码是用 C# 编写的,但希望你能看到它是关于什么的 :)

我相信 Cast首先尝试查看一个简单的引用转换是否有效——即它可以在哪里返回相同的引用。

例如:

String x = "hello";
IEnumerable<char> y = x.Cast<char>();
Console.WriteLine(object.ReferenceEquals(x, y)); // Prints true

不幸的是,它使用 CLR 兼容性规则来做到这一点 - 根据 UInt16[]Int16[]是兼容的。这导致了这种情况的发生:
short[] array = new short[]{4, 5, 6};
IEnumerable<ushort> cast = array.Cast<ushort>();
Console.WriteLine(object.ReferenceEquals(array, cast)); // Prints True

不幸的是,如果您尝试调用 ToArray() ,不开心:
// Explicit type argument just for clarity
cast.ToArray<ushort>(); // Bang
ToArray毫无疑问,它试图做一些优化——在这种特殊情况下失败了,因为类型不是它真正期望的。

我相信正确的行为应该是 Cast返回一个惰性迭代器,但稍后执行时会失败。如果您尝试从 Int16 开始,就会发生这种情况。至 Int32 , 例如。

现在,回到你真正想做的事情:使用 Select而是打电话。 Cast仅用于拆箱操作和引用类型转换。

关于.net - 为什么 IEnumerable 的这个 ToArray() 扩展方法会抛出 ArrayTypeMismatchException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1900598/

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