1

我最近在我的开发硬件上安装了最新版本的 OSX、Xcode 和 Xamarin Monotouch,但我无法让最简单的 Monogame 示例正常运行。

这是弹跳框示例,它在应用程序启动时崩溃,在第一次初始化 A = 255 的 Color 结构时:

public byte A
{
    ...

    set
    {
        this._packedValue = (this._packedValue & 0x00ffffff) | ((uint)(value << 24));
    }
}

这段代码在 Windows 甚至 iOS 模拟器上都可以正常工作,但是当我在 iPad 1 (iOS 5) 或 iPhone 5 (iOS6) 上运行它时,我得到的异常是“System.OverflowException: Number overflow.”。如果我将代码更改为不会导致溢出:

set
{
    var val = (uint)value;

    var val2 = val << 24;

    this._packedValue = (this._packedValue & 0x00ffffff) | val2;
}

这个问题消失了,但同样的问题也出现在 R、G 和 B 属性中。我的直觉是 Monogame 在编写时并没有考虑到数字溢出,并且可能有无数这样的例子。由于编写了示例代码,这一定是一个“新”问题。

我是否缺少一些编译器开关来强制它忽略数字溢出?我正在使用 Visual Studio 2012 通过网络进行部署,在项目属性下我看不到任何与此相关的设置。

4

1 回答 1

0

unchecked如果我理解问题和 msdn 文档,您可以在一个块内完成整个操作。

set
{
    unchecked
    {
        this._packedValue = (this._packedValue & 0x00ffffff) | ((uint)(value << 24));
    }
}

但是,这可能会导致意想不到的后果(负数,但由于您使用的是无符号数,因此我不确定您是从 0 开始还是仍然引发异常),而且我从未亲自使用过它。

可以在这里找到参考:http: //msdn.microsoft.com/en-us/library/a569z7k8 (v=vs.110).aspx

于 2013-04-18T03:19:54.713 回答