将long转换为对象,然后转换为ulong。

5
为什么C#不能将long类型隐式转换为object类型,然后再转换为ulong类型?
    long a = 0;
    Object c = a;
    ulong b = (ulong)c; // throw exception here

请查看此问题:https://dev59.com/T0jSa4cB1Zd3GeqPD0f8#1080957 - Doctor Jones
4个回答

7

你只能拆箱(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
@akton 正确。我想要明确表达表达式的评估,因此加了一组额外的括号。 - Rune FS

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的此博客文章


哈哈,谢谢你的帮助。你提供的链接非常有用,正是我所需要的! - ricky

1
如果值大于 long 的最大值(9,223,372,036,854,775,807),则会导致数据丢失。 ulong 的最小值为零,最大值为18,446,744,073,709,551,615。
要避免此风险进行转换,请使用
ulong b = Convert.ToUInt64(c);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接