将long转换为object然后转换为ulong

时间:2012-09-17 12:27:42

标签: c# casting implicit-conversion

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

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

4 个答案:

答案 0 :(得分:7)

您只能取消装箱与装箱的完全相同的类型

 Object c = a

框a a很长

 ulong b = (ulong)c;

尝试将c取消设置为ulong,但它很长,因此失败。

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

可以工作,因为它将c解包为long。 c很长这将起作用,你可以长期投入到ulong

答案 1 :(得分:5)

如果您输入值类型T,则只能将其自身或作为Nullable(T?)取消装箱。 任何其他演员表都无效。

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

所以这是合法的:

var c = (long) b;

这也是合法的:

var c = (long?) b;

但这不是:

var c = (ulong) b;

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

var c = (ulong)(long) b;

有关详细信息,请参阅此blog post by Eric Lippert

答案 2 :(得分:1)

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

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

要在没有此风险的情况下进行转换

ulong b = Convert.ToUInt64(c);

答案 3 :(得分:0)

简短而简单的答案:因为长而且ulong不是同一类型。一个是签名长,另一个是无签名长。