Anda memiliki beberapa opsi:
(int)
- Operator cor. Berfungsi jika objek sudah bilangan bulat pada tingkat tertentu dalam hierarki warisan atau jika ada konversi implisit yang ditentukan.
int.Parse()/int.TryParse()
- Untuk mengkonversi dari serangkaian format yang tidak dikenal.
int.ParseExact()/int.TryParseExact()
- Untuk mengkonversi dari string dalam format tertentu
Convert.ToInt32()
- Untuk mengonversi objek dari tipe yang tidak dikenal. Ini akan menggunakan konversi eksplisit dan implisit atau implementasi IConvertible jika ada yang didefinisikan.
as int?
- Perhatikan "?". The as
operator adalah hanya untuk referensi jenis, dan jadi saya menggunakan "?" untuk menandakan a Nullable<int>
. Operator " as
" bekerja seperti Convert.To____()
, tetapi pikirkan TryParse()
daripada Parse()
: itu mengembalikan null
daripada melemparkan pengecualian jika konversi gagal.
Dari jumlah tersebut, saya lebih suka (int)
jika objeknya benar-benar hanya bilangan bulat kotak. Kalau tidak gunakan Convert.ToInt32()
dalam kasus ini.
Perhatikan bahwa ini adalah jawaban yang sangat umum : Saya ingin memberi perhatian pada respons Darren Clark karena saya pikir ini merupakan pekerjaan yang baik untuk menangani hal-hal spesifik di sini, tetapi datang terlambat dan belum juga memilih. Dia mendapatkan suara saya untuk "jawaban yang diterima", bagaimanapun, untuk juga merekomendasikan (int), untuk menunjukkan bahwa jika gagal (int)(short)
mungkin bekerja sebagai gantinya, dan untuk merekomendasikan Anda memeriksa debugger Anda untuk mengetahui jenis runtime yang sebenarnya.
Para pemain
(int) myobject
seharusnya hanya bekerja.Jika itu memberi Anda pengecualian pemain yang tidak valid maka itu mungkin karena jenis varian bukan VT_I4. Taruhan saya adalah bahwa varian dengan VT_I4 dikonversi menjadi kotak int, VT_I2 menjadi kotak pendek, dll.
Ketika melakukan gips pada tipe nilai kotak, itu hanya berlaku untuk melemparkannya ke tipe kotak. Misalnya musuh, jika varian yang dikembalikan sebenarnya adalah VT_I2 maka
(int) (short) myObject
harus berfungsi.Cara termudah untuk mengetahuinya adalah dengan memeriksa objek yang dikembalikan dan melihat tipenya di debugger. Juga pastikan bahwa dalam unit interop Anda memiliki nilai kembali yang ditandai
MarshalAs(UnmanagedType.Struct)
sumber
Convert.ToInt32 (objek saya);
ini akan menangani kasus di mana objek saya adalah nol dan mengembalikan 0, alih-alih melemparkan pengecualian.
sumber
ToInt32
.Gunakan
Int32.TryParse
sebagai berikut.sumber
Saya mencantumkan perbedaan dalam setiap cara casting. Apa jenis penanganan casting tertentu dan tidak?
sumber
Mungkin Convert.ToInt32 .
Perhatikan pengecualian, dalam kedua kasus.
sumber
sumber
Convert.ChangeType
. Saya akan mengatakan mungkin bukan jawaban yang sempurna untuk OP, tetapi pasti membantu beberapa orang!Ada juga TryParse .
Dari MSDN:
sumber
Aneh, tetapi jawaban yang diterima tampaknya salah tentang para pemeran dan Konversi dalam arti bahwa dari tes saya dan membaca dokumentasi juga tidak boleh memperhitungkan operator implisit atau eksplisit akun.
Jadi, jika saya memiliki variabel tipe objek dan kelas "kotak" memiliki beberapa operator implisit yang ditentukan mereka tidak akan bekerja.
Alih-alih cara sederhana lain, tetapi sebenarnya biaya kinerja adalah untuk melakukan sebelumnya secara dinamis.
(int) (dinamis) myObject.
Anda dapat mencobanya di jendela Interaktif VS.
sumber
dynamic
jauh dari gratissumber