7

私はobject o箱入りであることが知られているintまたはuint

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

ボックスに何が入っているのかわかりません。気になるのは、intまたはに強制したい4バイトがあることだけですuint。これは、unchecked(ボックスではなく)値があるコンテキストで正常に機能します。

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

注:デフォルトでは、C#のすべてがチェックされていません。リテラルを処理していて、コンパイラーが本当に自分自身を足で撃ちたいかどうかを知りたいので、チェックされていないコンテキストはここでのみ必要です。

問題は、ボックス内の内容がわからないことです(4バイト以外)が、間違ったタイプにボックスを解除しようとすると、ランタイムがそうしますInvalidCastException。私はこれが妥当な実行時の動作であることを知っていますが、この場合、私は自分が何をしているのかを知っており、「チェックされていないボックスから外す」必要があります。そのようなものは存在しますか?

再試行できることはわかっているcatchので、それは答えとしてカウントされません。

4

1 に答える 1

4

Convert.ToInt32を使用して、可能であれば任意のオブジェクトをintに変換できますが、変換または解析も実行されるため、必要以上に遅くなる可能性があります。

それがintまたはuintであることがわかっている場合は、次のようにすることができます。

int x = (o is int) ? (int)o : (int)(uint)o;
于 2010-08-30T11:50:32.923 に答える