为什么C#不能将long类型隐式转换为object类型,然后再转换为ulong类型?
long a = 0;
Object c = a;
ulong b = (ulong)c; // throw exception here
long a = 0;
Object c = a;
ulong b = (ulong)c; // throw exception here
你只能拆箱(unbox)为与装箱(boxed)时的完全相同的类型
Object c = a
boxes是一个长的a元素
ulong b = (ulong)c;
试图将 c 设为 ulong 但它是 long 类型,因此失败。
ulong b = (ulong)((long)c);
由于将c解除装箱为long,因此这个方法可以工作。因为c是long类型,所以这会起作用并且您可以将long强制转换为ulong。
ulong b = (ulong)(long) c
,尽管可能会发生溢出和下溢的情况。 - akton如果你封装一个值类型T,那么你只能将其解封装为它本身或Nullable(T?)。
任何其他的转换都是无效的。这是因为从对象进行强制转换永远不能被解释为一种转换,而long和ulong之间则存在一种转换。
所以这是合法的:
var c = (long) b;
var c = (long?) b;
var c = (ulong) b;
如果你想做你想做的事情,你需要进行两次转换:第一次只是开箱,第二次才是实际的转换:
var c = (ulong)(long) b;
欲了解更多信息,请参见Eric Lippert的此博客文章。
long
的最大值(9,223,372,036,854,775,807),则会导致数据丢失。
ulong
的最小值为零,最大值为18,446,744,073,709,551,615。ulong b = Convert.ToUInt64(c);