5

为什么 C# 不能将 long var 隐式转换为 object var 然后再转换为 ulong?

    long a = 0;
    Object c = a;
    ulong b = (ulong)c; // throw exception here
4

4 回答 4

7

您只能拆箱到与装箱完全相同的类型

 Object c = a

盒子a很长

 ulong b = (ulong)c;

尝试将 c 作为 ulong 拆箱,但它很长,因此失败。

 ulong b = (ulong)((long)c);

会起作用,因为它将 c 拆箱很长。c 很长,这将起作用,您可以将 long 转换为 ulong

于 2012-09-17T12:29:22.607 回答
6

如果将值类型 T 装箱,则只能将其拆箱为自身或 Nullable ( T? )。任何其他演员都是无效的。

那是因为对象的强制转换永远不能被解释为转换,而 是 long 和 ulong 之间的转换。

所以这是合法的:

var c = (long) b;

这也是合法的:

var c = (long?) b;

但这不是:

var c = (ulong) b;

要做你想做的,你必须投两次:第一次只是拆箱,第二次是实际的转换:

var c = (ulong)(long) b;

有关详细信息,请参阅Eric Lippert 的这篇博文

于 2012-09-17T12:34:14.327 回答
1

如果该值大于 a long(9,223,372,036,854,775,807) 的最大值,上述所有情况都会导致数据丢失。

ulong最小值为零,最大值为 18,446,744,073,709,551,615。

在没有这种风险的情况下进行转换

ulong b = Convert.ToUInt64(c);
于 2018-04-22T13:57:27.347 回答
0

简短的回答:因为 long 和 ulong 不是同一类型。一个是有符号长,另一个是无符号长。

于 2012-09-17T12:29:30.727 回答