代码之家  ›  专栏  ›  技术社区  ›  Johannes Rudolph

在不知道盒子里是什么的情况下拆开uint/int

  •  7
  • Johannes Rudolph  · 技术社区  · 14 年前

    我有一个 object o 那是众所周知的盒装 int uint :

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

    我不知道盒子里是什么,我关心的是里面有4个字节,我想强制到一个 内景 . 这在一个环境中工作得很好 unchecked 当我有值(而不是框)时的上下文:

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

    注意:默认情况下,C#中的所有内容都是未选中的,未选中的上下文只在这里是必需的,因为我们处理的是文本,编译器想知道我们是否真的想自取灭亡。

    InvalidCastException . 我知道这是合理的运行时行为,但在这种情况下,我知道我在做什么,并希望一个“unchecked unbox”。这样的事存在吗?

    我知道我可以 catch

    1 回复  |  直到 14 年前
        1
  •  4
  •   Quartermeister    14 年前

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

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

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