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

时间:2018-10-12 19:23:12

标签: c#

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'。”

嗯?解释器先生,当我要求您对变量System.Byte执行此操作时,如何将System.UInt64强制转换为wtf,但是当我要求您对变量pandas执行此操作时,您一次抱怨整个阵列吗?

老实说,这是怎么回事?我已经困了,想念一些简单的东西吗?有人可以对我解释一下吗?

1 个答案:

答案 0 :(得分:5)

Enumerable.Cast<T>的MSDN文档规定以下内容:

  

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

因此,从根本上讲,只有将非泛型集合转换为可用于LINQ才可以。它仅适用于在运行时(或装箱)已经具有目标类型的对象,而byteulong则不是这种情况,而是对内存中字节的重新解释

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

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