Sie haben mehrere Möglichkeiten:
(int)
- Cast Operator. Funktioniert, wenn das Objekt auf einer bestimmten Ebene in der Vererbungshierarchie bereits eine Ganzzahl ist oder wenn eine implizite Konvertierung definiert ist.
int.Parse()/int.TryParse()
- Zum Konvertieren von einer Zeichenfolge unbekannten Formats.
int.ParseExact()/int.TryParseExact()
- Zum Konvertieren von einer Zeichenfolge in einem bestimmten Format
Convert.ToInt32()
- Zum Konvertieren eines Objekts unbekannten Typs. Es wird eine explizite und implizite Konvertierung oder eine IConvertible-Implementierung verwendet, falls vorhanden.
as int?
- Beachten Sie das "?". Der as
Operator ist nur für Referenztypen und deshalb habe ich "?" a Nullable<int>
. Der as
Operator " " funktioniert wie Convert.To____()
, denkt aber TryParse()
eher als Parse()
: Er gibt zurück, null
anstatt eine Ausnahme auszulösen, wenn die Konvertierung fehlschlägt.
Von diesen würde ich es vorziehen, (int)
wenn das Objekt wirklich nur eine Ganzzahl in einer Box ist. Andernfalls Convert.ToInt32()
in diesem Fall verwenden.
Beachten Sie, dass dies eine sehr allgemeine Antwort ist: Ich möchte etwas Aufmerksamkeit auf Darren Clarks Antwort lenken, da ich denke, dass sie gute Arbeit leistet, um die Einzelheiten hier anzusprechen , aber zu spät gekommen ist und noch nicht gewählt wurde. Er erhält meine Stimme für "akzeptierte Antwort", weil er (int) empfohlen hat, darauf hingewiesen hat, dass ein Fehler (int)(short)
möglicherweise stattdessen funktioniert, und weil er empfohlen hat, Ihren Debugger zu überprüfen, um den tatsächlichen Laufzeittyp herauszufinden.
Die Besetzung
(int) myobject
sollte einfach funktionieren.Wenn dies zu einer ungültigen Besetzungsausnahme führt, liegt dies wahrscheinlich daran, dass der Variantentyp nicht VT_I4 ist. Ich wette, dass eine Variante mit VT_I4 in ein Boxed Int, VT_I2 in ein Boxed Short usw. umgewandelt wird.
Wenn Sie einen Casting-Wert für einen Boxed-Value-Typ ausführen, ist es nur gültig, ihn in den Boxed-Typ umzuwandeln. Feind Beispiel, wenn die zurückgegebene Variante tatsächlich ein VT_I2 ist,
(int) (short) myObject
sollte funktionieren.Der einfachste Weg, dies herauszufinden, besteht darin, das zurückgegebene Objekt zu untersuchen und seinen Typ im Debugger zu überprüfen. Stellen Sie außerdem sicher, dass in der Interop-Assembly der Rückgabewert mit markiert ist
MarshalAs(UnmanagedType.Struct)
quelle
Convert.ToInt32 (myobject);
Dies behandelt den Fall, in dem myobject null ist und 0 zurückgibt, anstatt eine Ausnahme auszulösen.
quelle
ToInt32
.Verwenden Sie
Int32.TryParse
wie folgt.quelle
Ich liste den Unterschied in jeder der Casting-Möglichkeiten auf. Was für eine bestimmte Art von Gussgriffen und nicht?
quelle
Vielleicht Convert.ToInt32 .
Achten Sie in beiden Fällen auf Ausnahmen.
quelle
quelle
Convert.ChangeType
. Ich würde sagen, dass dies möglicherweise nicht die perfekte Antwort für OP ist, aber es ist definitiv hilfreich für einige!Es gibt auch TryParse .
Von MSDN:
quelle
Seltsam, aber die akzeptierte Antwort scheint in Bezug auf die Besetzung und den Konvertieren falsch zu sein, da meine Tests und das Lesen der Dokumentation implizite oder explizite Operatoren nicht berücksichtigen sollten.
Wenn ich also eine Variable vom Typ Objekt habe und in der Klasse "boxed" einige implizite Operatoren definiert sind, funktionieren sie nicht.
Stattdessen ist ein anderer einfacher Weg, aber wirklich Leistungskosten, vorher in dynamisch zu gießen.
(int) (dynamisch) myObject.
Sie können es im interaktiven Fenster von VS versuchen.
quelle
dynamic
istquelle