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

ric*_*cky 4 c# casting implicit-conversion

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

    long a = 0;
    Object c = a;
    ulong b = (ulong)c; // throw exception here
Run Code Online (Sandbox Code Playgroud)

Run*_* FS 7

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

 Object c = a
Run Code Online (Sandbox Code Playgroud)

盒子a很长

 ulong b = (ulong)c;
Run Code Online (Sandbox Code Playgroud)

尝试将unbox c作为ulong但是它很长并因此失败.

 ulong b = (ulong)((long)c);
Run Code Online (Sandbox Code Playgroud)

会工作,因为它取消了c长.如果长,这将起作用,你可以长期投入到ulong


Fal*_*nwe 5

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

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

所以这是合法的:

var c = (long) b;
Run Code Online (Sandbox Code Playgroud)

这也是合法的:

var c = (long?) b;
Run Code Online (Sandbox Code Playgroud)

但这不是:

var c = (ulong) b;
Run Code Online (Sandbox Code Playgroud)

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

var c = (ulong)(long) b;
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Eric Lippert撰写的博客文章.