2012-11-08 97 views
15

我有int變量與價值820924 當我試圖把它轉換成這樣:如何轉換INT爲uint

(uint)data[structure["MICROSECONDS"].Index]

它不工作

這不工作以及

unchecked((uint)data[structure["MICROSECONDS"].Index])

我收到「指定轉換無效。」例外。

數據存儲object但在運行時我應該嘗試轉換int。我幾乎可以肯定。我打印的對象值是820924,但是我不知道如何打印對象類型,但它必須是int。

代碼:

object value = data[structure["MICROSECONDS"].Index]; 
Console.WriteLine("xx MICROSECONDS type " + value.GetType()); 
Console.WriteLine("xx casting " + value); 
Console.WriteLine("xx cast ok" + (uint)value); 

結果:

xx MICROSECONDS type System.Int32 
xx casting 820924 
+2

'變種I =(UINT)820924;'作品。你的'Index'可能返回一個字符串嗎? –

+0

@ L.B它不應該如此,但我不知道如何檢查這在運行時 – javapowered

+0

嘗試'Convert.ToUInt32' –

回答

31

首先,你應該檢查你的價值類型。您可以通過調用obj.GetType()方法(在您的代碼中直接或在立即窗口中)來完成。

如果是int那麼你可以做:

uint u = (uint) (int) obj; 

請注意,它從你的施法不同,因爲它蒙上int然後轉換uint,而你試圖uintint不能轉換爲uint,這就是爲什麼你得到InvalidCastExceptionint可以只有轉換成uint。令人困惑的是,轉換轉換運營商看起來在代碼相同:u = (uint) x

你可以做的事情更容易從Convert類調​​用具體方法:

uint u = Convert.ToUInt32(x); 
0

這有可能是Index屬性返回一個字符串或東西。你可以做到以下幾點:

var num = Convert.ToUInt32(data[structure["MICROSECONDS"].Index]); 

Convert.ToUInt32與所有相關類型的一個uint可以轉換超載。

1

如果指數是一個字符串,或者轉換爲字符串,你可以嘗試有類似的表示一個數字:

所有的
UInt32 microSecondsIndex; 
if(Uint32.TryParse(data[structure["MICROSECONDS"].Index.ToString()],out microSecondsIndex)) 
{ 
    //Do Stuff 
} 
else 
{ 
    //Do error handling 
} 
+0

@Snowbear它可能是一個字符串,已經看到了怪異的數據存儲,但注意到,已經編輯,以反映TryParse約束 – user1793607

+0

我的意思是它顯然不是一個字符串,因爲如果它是一個字符串(在編譯時)那麼將其轉換爲'uint'將不會編譯。但問題表明它可以被編譯,這意味着它是一個「對象」。而'object'不能直接傳遞給'TryParse' – Snowbear

2

的問題是,int存儲爲objectInt來自對象,但uint不是從int派生,所以你不能投int存儲爲objectuint。首先,您必須將其投射到int,然後到uint,因爲該投射是有效的。自己嘗試一下:

object o = 5;//this is constant that represents int, constant for uint would be 5u 
uint i = (uint)o;//throws exception 

但這個工程:

object o = 5; 
int i = (int)o; 
uint j = (uint)i; 

object o = 5; 
uint i = (uint)(int)o; //No matter how this looks awkward