为什么C#不能将long var隐式转换为对象var然后转换为ulong?
long a = 0;
Object c = a;
ulong b = (ulong)c; // throw exception here
答案 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不是同一类型。一个是签名长,另一个是无签名长。