Masz kilka możliwości:
(int)
- Operator rzutowania. Działa, jeśli obiekt jest już liczbą całkowitą na pewnym poziomie w hierarchii dziedziczenia lub jeśli zdefiniowano niejawną konwersję.
int.Parse()/int.TryParse()
- Do konwersji z ciągu o nieznanym formacie.
int.ParseExact()/int.TryParseExact()
- Do konwersji z ciągu znaków w określonym formacie
Convert.ToInt32()
- Do konwersji obiektu nieznanego typu. Użyje jawnej i niejawnej konwersji lub implementacji IConvertible, jeśli taka jest zdefiniowana.
as int?
- Zanotuj "?". as
Operator jest tylko dla typów referencyjnych, a więc użyłem „?” oznaczać Nullable<int>
. Operator „ as
” działa tak samo Convert.To____()
, jak , ale TryParse()
raczej zamiast Parse()
: zwraca, null
a nie rzuca wyjątek, jeśli konwersja się nie powiedzie.
Spośród nich wolałbym, aby (int)
obiekt był po prostu liczbą całkowitą w pudełku. W przeciwnym razie użyj Convert.ToInt32()
w tym przypadku.
Zwróć uwagę, że jest to bardzo ogólna odpowiedź: chcę zwrócić uwagę na odpowiedź Darrena Clarka, ponieważ uważam, że dobrze radzi sobie ze szczegółami tutaj, ale przyszedł późno i nie został jeszcze głosowany. Otrzymuje mój głos na „zaakceptowaną odpowiedź”, w każdym razie za zalecenie (int), za wskazanie, że jeśli to się nie powiedzie, (int)(short)
może to zadziałać, i za zalecenie sprawdzenia debugera, aby dowiedzieć się, jaki jest rzeczywisty typ środowiska wykonawczego.
Obsada
(int) myobject
powinna po prostu działać.Jeśli to daje nieprawidłowy wyjątek rzutowania, to prawdopodobnie dlatego, że typ wariantu nie jest VT_I4. Obstawiam, że wariant z VT_I4 jest konwertowany na int boxed, VT_I2 na short box itd.
Podczas rzutowania na opakowany typ wartości można rzutować tylko na typ w pudełku. Na przykład, jeśli zwrócony wariant jest w rzeczywistości VT_I2, to
(int) (short) myObject
powinien działać.Najłatwiejszym sposobem, aby się tego dowiedzieć, jest zbadanie zwróconego obiektu i przyjrzenie się jego typowi w debugerze. Upewnij się również, że w zestawie międzyoperacyjnym masz wartość zwracaną oznaczoną za pomocą
MarshalAs(UnmanagedType.Struct)
źródło
Convert.ToInt32 (myobject);
to obsłuży przypadek, w którym myobject ma wartość null i zwróci 0, zamiast zgłaszać wyjątek.
źródło
ToInt32
.Użyj
Int32.TryParse
w następujący sposób.źródło
Wymieniam różnice w każdym ze sposobów rzucania. Jaki konkretny typ odlewu obsługuje, a nie?
źródło
Może Convert.ToInt32 .
W obu przypadkach uważaj na wyjątek.
źródło
źródło
Convert.ChangeType
. Powiedziałbym, że może nie być idealną odpowiedzią na OP, ale dla niektórych jest to zdecydowanie pomocne!Jest też TryParse .
Z MSDN:
źródło
Dziwne, ale przyjęta odpowiedź wydaje się błędna co do rzutowania i Convert w tym sensie, że z moich testów i czytania dokumentacji również nie powinno uwzględniać operatorów niejawnych ani jawnych.
Tak więc, jeśli mam zmienną typu object, a klasa „pudełkowa” ma zdefiniowane pewne niejawne operatory, nie będą one działać.
Zamiast tego inny prosty sposób, ale tak naprawdę wycenianie wydajności polega na rzucaniu wcześniej w trybie dynamicznym.
(int) (dynamiczny) myObject.
Możesz to wypróbować w interaktywnym oknie VS.
źródło
dynamic
jest daleki odźródło