2012-09-17 397 views
3

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

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

看到这个问题:http://stackoverflow.com/questions/1080945/why-cant-i-pull-a-ushort-from-a-system-object-and-then-cast-it-as-a -uint -c/1080957#1080957 –

回答

6

你只能拆箱完全相同的类型是盒装

Object c = a 

箱一个它是一个长期的

ulong b = (ulong)c; 

试图拆箱C作为ULONG但它是一个很长,因此失败。

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

会起作用,因为它会将c取消装箱。 c长这会工作,你可以投很长时间ulong

+0

你可以去'ulong b =(ulong)(long)c',尽管(溢出和下溢不能抵抗)。 – akton

+0

@akton正确。我想对表达式进行明确的评估,因此额外设置了() –

+0

感谢您的回答! – ricky

0

简单和简单的答案:beacuse长和ulong不是相同的类型。一个是长签名,另一个是无签名长签名。

4

如果您填入值类型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

+0

优秀的参考资料,我只是在寻找。 – Freeman

+0

哈,谢谢你的帮助。您的链接非常有用。这正是我正在寻找的! – ricky