繁体   English   中英

无法将“System.Byte”类型的对象强制转换为“System.UInt64”类型

[英]Unable to cast object of type 'System.Byte' to type 'System.UInt64'

byte转换为ulong吗?

看起来似乎如此。 这不会抛出:

byte wtf = HttpContext.Connection.RemoteIpAddress.GetAddressBytes()[0];
ulong ffs = (ulong)wtf;

好的,让我们尝试将整个数组转换为:

ulong[] ip = HttpContext.Connection.RemoteIpAddress.GetAddressBytes().Cast<ulong>().ToArray();

这引发了!?

System.InvalidCastException:'无法将'System.Byte'类型的对象强制转换为'System.UInt64'。'

嗯? 解释器先生,当我要求你为变量wtf执行此操作时,你怎么可能将System.ByteSystem.UInt64 ,但是当我要求你立即为整个阵列执行此操作时,你会抱怨?

说实话,这里发生了什么? 我已经困了,想念一些简单的东西吗? 有人可以向我解释这个吗?

Enumerable.Cast<T>的MSDN文档声明如下:

此方法的源序列是IEnumerable,这意味着元素具有编译时静态类型的对象。 此方法执行的唯一类型转换是引用转化和拆箱转换。 集合中元素的运行时类型必须与目标类型匹配,或者在值类型的情况下,元素的运行时类型必须是目标类型的装箱转换的结果。 不允许使用其他转换类型,例如不同数字类型之间的转换类型

因此,它只是用于转换非泛型集合以使它们可用于LINQ。 它仅适用于在运行时(或盒装)中已经是目标类型的对象,而不是byteulong的情况,而是对内存中字节的重新解释。

您必须使用Select来执行强制转换:

ulong[] ip = HttpContext.Connection.RemoteIpAddress.GetAddressBytes()
              .Select(x => (ulong)x).ToArray();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM