为什么 C# 不能将 long var 隐式转换为 object var 然后再转换为 ulong?
long a = 0;
Object c = a;
ulong b = (ulong)c; // throw exception here
为什么 C# 不能将 long var 隐式转换为 object var 然后再转换为 ulong?
long a = 0;
Object c = a;
ulong b = (ulong)c; // throw exception here
您只能拆箱到与装箱完全相同的类型
Object c = a
盒子a很长
ulong b = (ulong)c;
尝试将 c 作为 ulong 拆箱,但它很长,因此失败。
ulong b = (ulong)((long)c);
会起作用,因为它将 c 拆箱很长。c 很长,这将起作用,您可以将 long 转换为 ulong
如果将值类型 T 装箱,则只能将其拆箱为自身或 Nullable ( T? )。任何其他演员都是无效的。
那是因为对象的强制转换永远不能被解释为转换,而 是 long 和 ulong 之间的转换。
所以这是合法的:
var c = (long) b;
这也是合法的:
var c = (long?) b;
但这不是:
var c = (ulong) b;
要做你想做的,你必须投两次:第一次只是拆箱,第二次是实际的转换:
var c = (ulong)(long) b;
有关详细信息,请参阅Eric Lippert 的这篇博文。
如果该值大于 a long
(9,223,372,036,854,775,807) 的最大值,上述所有情况都会导致数据丢失。
ulong
最小值为零,最大值为 18,446,744,073,709,551,615。
在没有这种风险的情况下进行转换
ulong b = Convert.ToUInt64(c);
简短的回答:因为 long 和 ulong 不是同一类型。一个是有符号长,另一个是无符号长。