取消装箱uint / int而不知道盒子里面有什么

时间:2010-08-30 11:46:02

标签: c# boxing coercion

我有object o已知为盒装intuint

object o = int.MinValue
object o = (uint)int.MinValue // same bytes as above

我不知道框中有什么内容,我关心的是那里有4个字节,我想要强制转换为intuint。当我有值(而不是框)时,这在unchecked上下文中工作正常:

unchecked
{
    int a = (int)0x80000000u; // will be int.MinValue, the literal is a uint
    uint b = (uint)int.MinValue;
}

注意:默认情况下,C#中的所有内容都是未选中的,未选中的上下文只在这里是必要的,因为我们正在处理文字,而编译器想要知道我们是否真的想要用脚射击自己。

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

我知道我可以catch并重试,因此这不算作答案。

1 个答案:

答案 0 :(得分:4)

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

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

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