Bagikan melalui


Konversi transmisi dan jenis (Panduan Pemrograman C#)

Karena C# diketik secara statis pada waktu kompilasi, setelah variabel dideklarasikan, C# tidak dapat dinyatakan lagi atau diberi nilai jenis lain kecuali jenis tersebut secara implisit dapat dikonversi ke jenis variabel. Misalnya, string tidak dapat dikonversi secara implisit ke int. Oleh karena itu, setelah Anda menyatakan i sebagai int, Anda tidak dapat menetapkan string "Hello" ke dalamnya, seperti yang ditunjukkan oleh kode berikut:

int i;

// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";

Namun, Terkadang Anda mungkin perlu menyalin nilai ke dalam parameter variabel atau metode dari jenis lain. Misalnya, Anda mungkin memiliki variabel bilangan bulat yang perlu Anda teruskan ke metode yang parameternya ditik sebagai double. Atau Anda mungkin perlu menetapkan variabel kelas ke variabel jenis antarmuka. Operasi semacam ini disebut konversi jenis. Di C#, Anda dapat melakukan jenis konversi berikut:

  • Konversi implisit: Tidak ada sintaks khusus yang diperlukan karena konversi selalu berhasil dan tidak ada data yang hilang. Contohnya termasuk konversi dari jenis integral yang lebih kecil ke yang lebih besar, konversi dari kelas turunan ke kelas dasar, dan konversi rentang.

  • Konversi eksplisit (cast): Konversi eksplisit memerlukan ekspresi cast. Transmisi diperlukan ketika informasi mungkin hilang dalam konversi, atau ketika konversi mungkin tidak berhasil karena alasan lain. Contoh umum termasuk konversi numerik ke jenis yang memiliki lebih sedikit presisi atau rentang yang lebih kecil, dan konversi instans kelas dasar ke kelas turunan.

  • Konversi yang ditentukan pengguna: Konversi yang ditentukan pengguna menggunakan metode khusus yang dapat Anda tentukan untuk mengaktifkan konversi eksplisit dan implisit antara jenis kustom yang tidak memiliki hubungan kelas turunan kelas dasar. Untuk informasi selengkapnya, lihat Operator konversi yang ditentukan pengguna.

  • Konversi dengan kelas pembantu: Untuk mengonversi antara jenis yang tidak kompatibel, seperti bilangan bulat dan System.DateTime objek, atau string heksadesimal dan array byte, Anda dapat menggunakan System.BitConverter kelas, System.Convert kelas, dan Parse metode jenis numerik bawaan, seperti Int32.Parse. Untuk informasi lebih lanjut, baca artikel berikut:

  • Cara mengonversi array byte ke int

  • Cara mengonversi string menjadi angka

  • Cara mengonversi antara string heksadesimal dan jenis numerik

Konversi implisit

Untuk jenis numerik bawaan, konversi implisit dapat dilakukan ketika nilai yang akan disimpan dapat masuk ke dalam variabel tanpa dipotong atau dibulatkan. Untuk jenis integral, pembatasan ini berarti rentang dari tipe sumber adalah himpunan bagian yang tepat dari rentang tipe target. Misalnya, variabel jenis panjang (bilangan bulat 64-bit) dapat menyimpan nilai apa pun yang dapat disimpan int (bilangan bulat 32-bit). Dalam contoh berikut, pengkompilasi secara implisit mengonversi nilai num di sebelah kanan ke jenis long sebelum menetapkannya ke bigNum.

// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;

Untuk daftar lengkap semua konversi numerik implisit, lihat bagian Konversi numerik implisit dari artikel Konversi numerik bawaan .

Untuk jenis referensi, konversi implisit selalu ada dari kelas ke salah satu kelas atau antarmuka dasar langsung atau tidak langsungnya. Tidak ada sintaks khusus yang diperlukan karena kelas turunan selalu berisi semua anggota kelas dasar.

Derived d = new Derived();

// Always OK.
Base b = d;

Konversi eksplisit

Namun, jika konversi tidak dapat dilakukan tanpa risiko kehilangan informasi, kompiler mengharuskan Anda melakukan konversi eksplisit, yang disebut casting. Pemeran adalah cara untuk membuat konversi secara eksplisit. Ini menunjukkan Bahwa Anda mengetahui kehilangan data mungkin terjadi, atau pemeran mungkin gagal pada waktu proses. Untuk melakukan pengubahan tipe, tentukan jenis tujuan dalam tanda kurung sebelum ekspresi yang ingin Anda konversi. Program berikut mengubah tipe double menjadi int. Program ini tidak dapat dikompilasi tanpa pengubahan tipe.

double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
Console.WriteLine(a);
// Output: 1234

Untuk daftar lengkap konversi numerik eksplisit yang didukung, lihat bagian Konversi numerik eksplisit dari artikel Konversi numerik bawaan .

Untuk tipe referensi, diperlukan konversi eksplisit jika Anda perlu mengubah dari tipe dasar ke tipe turunan.

Operasi cast antara tipe referensi tidak mengubah tipe waktu proses dari objek yang mendasarinya; ini hanya mengubah tipe nilai yang digunakan sebagai referensi terhadap objek tersebut. Untuk informasi selengkapnya, lihat Polimorfisme.

Ketik pengecualian konversi pada waktu proses

Dalam beberapa konversi jenis referensi, pengkompilasi tidak dapat menentukan apakah cast valid. Dimungkinkan untuk operasi konversi tipe yang terkompilasi dengan sukses, untuk gagal pada waktu eksekusi. Seperti yang ditunjukkan dalam contoh berikut, pemaksaan tipe yang gagal pada run time menyebabkan InvalidCastException dibuang.

Animal a = new Mammal();
Reptile r = (Reptile)a; // InvalidCastException at run time

Secara eksplisit mengonversi argumen a menjadi tipe Reptile adalah asumsi yang berbahaya. Lebih aman untuk tidak membuat asumsi, melainkan memeriksa jenisnya. C# menyediakan is operator untuk memungkinkan Anda menguji kompatibilitas sebelum benar-benar melakukan cast. Untuk informasi selengkapnya, lihat Cara mengkonversi dengan aman menggunakan pencocokan pola dan operator as dan is.

Spesifikasi bahasa C#

Untuk informasi selengkapnya, lihat bagian Konversi dari spesifikasi bahasa C#.

Lihat juga