2010-08-30 54 views
7

我有一個衆所周知的object o是一個盒裝intuint拆箱UINT /不知道有什麼箱內INT

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

我不知道什麼是在箱子裏,我所關心的是那裏面有4個字節,我想強制到intuint。這時候我有值(而不是框)的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和重試,所以這不算作答案。

回答

4

如果可能的話,您可以使用Convert.ToInt32將任何對象轉換爲int,但它也會進行轉換或解析,因此它可能比您想要的要慢。

如果你知道這是一個int或uint,你可以這樣做:

int x = (o is int) ? (int)o : (int)(uint)o; 
+0

轉換引發溢出異常(我需要選中強制)。雖然檢查包裝箱內容是個好主意,但仍希望有更好的解決方案。 – 2010-08-30 11:54:23

+0

@Johannes:你可以'unchecked((uint)Convert.ToInt64(o))'通過轉換爲更大的大小來避開異常,儘管如果你需要處理64位整數,你不會有一個更大的尺寸來做到這一點。 – Quartermeister 2010-08-30 12:04:45