在不知道盒子里面有啥的情况下拆箱 uint/int

Posted

技术标签:

【中文标题】在不知道盒子里面有啥的情况下拆箱 uint/int【英文标题】:Unboxing uint/int without knowing what's inside the box在不知道盒子里面有什么的情况下拆箱 uint/int 【发布时间】:2011-04-05 17:27:18 【问题描述】:

我有一个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。我知道这是合理的运行时行为,但在这种情况下,我知道我在做什么并且想要一个“未选中的取消框”。存在这样的东西吗?

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

Convert 引发溢出异常(我需要未经检查的强制)。检查盒子内容是个好主意,但仍然希望有更好的解决方案。 @Johannes:您可以使用unchecked((uint)Convert.ToInt64(o)) 通过转换为更大的大小来绕过异常,尽管如果您需要处理 64 位整数,您将不会有更大的大小这样做。

以上是关于在不知道盒子里面有啥的情况下拆箱 uint/int的主要内容,如果未能解决你的问题,请参考以下文章

在不知道类型是啥的情况下调用返回泛型集合的泛型方法? C#

如何在不知道当前/主视图是啥的情况下从后台线程打开新视图?

处理 requestAttributionDetailsWithBlock 和 NSDictionary。在不知道它到底是啥的情况下将任何类型转换为 NSString

css中怎么在不放大盒子的情况下放大盒子中的图片?

在不知道盒子高度的时候,让盒子中的子元素垂直居中

VB中 randomize 是用来干啥的 +他和不+他有啥区别 请举例说明