C# 在不知道是什么的情况下解装箱uint/int';盒子里有什么

C# 在不知道是什么的情况下解装箱uint/int';盒子里有什么,c#,boxing,coercion,C#,Boxing,Coercion,我有一个对象o,已知它是一个装箱的int或uint: object o = int.MinValue object o = (uint)int.MinValue // same bytes as above 我不知道盒子里有什么,我关心的是里面有4个字节,我想强制它变成int或uint。当我有值(而不是框)时,这在未选中的上下文中可以正常工作: 注意:默认情况下,C#中的所有内容都是未选中的,未选中的上下文仅在这里是必要的,因为我们处理的是文本,编译器想知道我们是否真的想自食其果 现在的问题是

我有一个
对象o
,已知它是一个装箱的
int
uint

object o = int.MinValue
object o = (uint)int.MinValue // same bytes as above
我不知道盒子里有什么,我关心的是里面有4个字节,我想强制它变成
int
uint
。当我有值(而不是框)时,这在
未选中的
上下文中可以正常工作:

注意:默认情况下,C#中的所有内容都是未选中的,未选中的上下文仅在这里是必要的,因为我们处理的是文本,编译器想知道我们是否真的想自食其果

现在的问题是,我不知道盒子里面是什么(除了4个字节),但是当我尝试取消装箱到错误的类型时,运行时会这样做,我会得到一个
InvalidCastException
。我知道这是合理的运行时行为,但在这种情况下,我知道我在做什么,并且想要一个“未经检查的unbox”。这样的事情存在吗

我知道我可以捕获
并重试,所以这不算答案。

如果可能的话,您可以使用它将任何对象转换为int,尽管它也会进行转换或解析,因此速度可能比您想要的慢

如果您知道它是int或uint,您可以这样做:

int x = (o is int) ? (int)o : (int)(uint)o;

Convert引发溢出异常(我需要未经检查的强制)。检查框内容是一个好主意,但仍然希望有更好的解决方案。@Johannes:您可以执行
unchecked((uint)Convert.ToInt64(o))
以通过转换为更大的大小来绕过异常,尽管如果您需要处理64位整数,您不会有更大的大小来处理。
int x = (o is int) ? (int)o : (int)(uint)o;