2012-11-08 15 views
15

in uint i mit dem Wert Variable int haben 820924 , wenn ich versuche, es so zu konvertieren:wie int konvertieren

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

es nicht

dies nicht funktioniert arbeiten auch

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

ich erhalte „das angegebene Ziel ungültig ist.“ Ausnahme.

Daten speichert object aber zur Laufzeit sollte ich versuchen, int zu konvertieren. Ich bin mir fast sicher. Ich habe Objekt Wert gedruckt es war 820924, aber ich weiß nicht, wie Objekttyp zu drucken, aber es muss int sein.

Code:

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); 

Ergebnis:

xx MICROSECONDS type System.Int32 
xx casting 820924 
+2

'var i = (uint) 820924;' Werke. Ist es möglich, dass Ihr 'Index' eine Zeichenfolge zurückgibt? –

+0

@ L.B es sollte nicht so sein, aber ich weiß nicht, wie man dies zur Laufzeit überprüfen – javapowered

+0

versuchen 'Convert.ToUInt32' –

Antwort

31

Zunächst sollten Sie die Art Ihrer Wert überprüfen. Sie können es tun, indem Sie obj.GetType() Methode aufrufen (entweder in Ihrem Code direkt oder im Direkt-Fenster).

Wenn es int ist, dann können Sie tun:

uint u = (uint) (int) obj; 

Bitte beachten Sie, dass es von Ihrem Guss unterscheidet, weil es zu int wirft und dann wandelt zu uint während Sie werfen versuchten, zu uint. int kann nicht in uint umgewandelt werden und deshalb erhalten Sie die InvalidCastException. int kann nur zu uint konvertiert werden. Es ist verwirrend, dass sowohl Umwandlung als auch Besetzung Operatoren in Code identisch aussehen: u = (uint) x.

Einfachere, was Sie tun können, ist ein spezielles Verfahren aus Convert Klasse aufrufen:

uint u = Convert.ToUInt32(x); 
0

Es ist möglich, dass die Index Eigenschaft einen String oder etwas zurückgibt. Sie könnten wie folgt vorgehen:

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

Convert.ToUInt32 ist mit allen relevanten Typen überlastet, dass ein uint kann von umgerechnet werden.

1

Wenn Index ein String ist, oder hat eine numerische wie Darstellung, wenn in eine Zeichenfolge konvertiert, können Sie versuchen:

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

@Snowbear Es könnte eine Zeichenfolge sein, haben seltsamer Datenspeicher gesehen, aber bemerkt, haben bearbeitet, um die Beschränkung auf TryParse – user1793607

+0

widerspiegeln Ich meine, es ist offensichtlich keine Zeichenfolge, denn wenn es eine Zeichenfolge wäre (zur Kompilierzeit) dann wird es in "uint" umgewandelt, wird nicht einmal kompiliert. Aber Frage besagt, dass es kompiliert werden kann, was bedeutet, dass es ein "Objekt" ist. Und "Objekt" kann nicht direkt an "TryParse" übergeben werden – Snowbear

2

Das Problem ist, dass int als object gespeichert ist.Int leitet sich von Objekt ab, aber uint stammt nicht von int, daher können Sie int nicht speichern, gespeichert als object bis uint. Zuerst müssen Sie es in int und dann in uint umwandeln, weil dieser Cast gültig ist. Versuchen Sie es selbst:

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

Aber das funktioniert:

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

oder

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