加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

.net – 为什么IEnumerable的ToArray()扩展方法抛出ArrayTypeMis

发布时间:2020-12-17 00:01:38 所属栏目:大数据 来源:网络整理
导读:为什么下一个示例抛出System.ArrayTypeMismatchException? New Int16(){4,5,6}.Cast(of UInt16).ToArray() 我希望这一行返回一个包含4,5和6的UInt16数组. 提前致谢. 这是Cast或ToArray,IMO中的错误.这个答案中的代码是在C#中,但希望你能看到它的内容:) 我相
为什么下一个示例抛出System.ArrayTypeMismatchException?
New Int16(){4,5,6}.Cast(of UInt16).ToArray()

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

提前致谢.

这是Cast或ToArray,IMO中的错误.这个答案中的代码是在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,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仅适用于拆箱操作和引用类型转换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读