Распаковка uint / int, не зная, что внутри коробки

У меня есть объект 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 . Я знаю, что это разумное поведение во время выполнения, но в этом случае я знаю, что делаю, и хочу, чтобы "снятая отметка" распаковывалась. Что-то подобное существует?

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

7
задан Johannes Rudolph 30 August 2010 в 12:32
поделиться