Как исправить числовое переполнение с помощью Monogame и Xamarin?

Я недавно установил последние версии OSX, Xcode и Xamarin Monotouch на свое оборудование для разработки и не могу заставить простейший пример Monogame работать правильно.

Это пример с прыгающим ящиком, и он падает при запуске приложения при первой инициализации структуры Color с A = 255:

public byte A
{
    ...

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

Этот код отлично работает в Windows и даже в симуляторе iOS, но когда я запускаю его на своем iPad 1 (iOS 5) или iPhone 5 (iOS6), я получаю исключение «System.OverflowException: переполнение числа». Если я изменю код, чтобы не вызывать переполнения:

set
{
    var val = (uint)value;

    var val2 = val << 24;

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

эта проблема исчезает, но та же проблема возникает и со свойствами R, G и B. Моя интуиция подсказывает, что Monogame не был написан с учетом переполнения чисел, и вполне может быть бесчисленное множество примеров этого. Это должна быть «новая» проблема, так как код примера был написан.

Есть ли какой-то переключатель компилятора, которого мне не хватает, чтобы заставить его игнорировать переполнение чисел? Я использую Visual Studio 2012 для развертывания по сети, и в свойствах проекта я не вижу никаких настроек, относящихся к этому.


person Jim Noble    schedule 18.04.2013    source источник
comment
Я пытался воспроизвести это, но у меня не было никакого успеха. Можете ли вы сообщить об ошибке на bugzilla.xamarin.com с готовым тестовым проектом, поскольку на самом деле этого не должно происходить ?   -  person Rolf Bjarne Kvinge    schedule 23.04.2013


Ответы (1)


Если я понимаю вопрос и документы msdn, вы можете выполнить всю операцию внутри блока unchecked.

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

Однако это может привести к непредвиденным последствиям (отрицательные числа, но, поскольку вы используете без знака, я не уверен, начинаете ли вы с 0 или все равно выдает исключение), и я никогда лично не использовал его.

Справку можно найти здесь: http://msdn.microsoft.com/en-us/library/a569z7k8(v=vs.110).aspx

person Pete Garafano    schedule 18.04.2013