Распаковка UINT / INT, не зная, что находится внутри коробки - PullRequest
7 голосов
/ 30 августа 2010

У меня есть object o, который известен в штучной упаковке int или uint:

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

Я не знаю, что в коробке, все, что меня волнует, это то, что там есть 4 байта, которые я хочу привести к int или uint. Это прекрасно работает в контексте unchecked, когда у меня есть значения (вместо полей):

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

Примечание: по умолчанию все в C # не проверено, непроверенный контекст необходим только здесь, потому что мы имеем дело с литералами, а компилятор хочет знать, действительно ли мы хотим выстрелить себе в ногу.

Проблема теперь в том, что я не знаю, что находится внутри коробки (кроме 4 байтов), но среда выполнения делает это, когда я пытаюсь распаковать в неправильный тип, я получаю InvalidCastException. Я знаю, что это разумное поведение во время выполнения, но в этом случае я знаю, что я делаю, и хочу "unchecked unbox". Существует ли что-то подобное?

Я знаю, что мог бы catch и повторить попытку, так что это не считается ответом.

1 Ответ

4 голосов
/ 30 августа 2010

Вы можете использовать Convert.ToInt32 для преобразования любого объекта в int, если это возможно, хотя он также будет выполнять преобразование или анализ, поэтому он может быть медленнее, чем вы хотите.

Если вы знаете, что это int или uint, вы можете сделать это:

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