Konversi eksplisit dan konversi jenis (Panduan Pemrograman C#)

Karena C# diketik secara statis pada waktu kompilasi, setelah variabel dinyatakan, C# tidak dapat dideklarasikan 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";

Tetapi, terkadang Anda mungkin perlu menyalin nilai ke dalam variabel atau parameter metode dari jenis lain. Misalnya, Anda mungkin memiliki variabel bilangan bulat yang perlu diteruskan ke metode yang parameternya diketik sebagai double. Atau Anda mungkin perlu menetapkan variabel kelas ke variabel jenis antarmuka. Jenis operasi 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, dan konversi dari kelas turunan ke kelas dasar.

  • Konversi eksplisit (konversi eksplisit): Konversi eksplisit memerlukan ekspresi konversi eksplisit. Mengonversi secara eksplisit diperlukan ketika informasi mungkin hilang dalam konversi, atau ketika konversi mungkin tidak berhasil karena alasan lain. Contoh umum termasuk konversi numerik ke jenis yang kurang 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 objek System.DateTime, atau string heksadesimal dan larik byte, Anda dapat menggunakan kelas System.BitConverter, kelas System.Convert, dan metode Parse dari jenis numerik bawaan, seperti Int32.Parse. Untuk informasi selengkapnya, lihat Cara mengonversi larik byte ke int, Cara mengonversi string menjadi angka, dan Cara mengonversi antara string heksadesimal dan jenis numerik.

Konversi implisit

Untuk jenis numerik bawaan, konversi implisit dapat dibuat ketika nilai yang akan disimpan dapat masuk ke dalam variabel tanpa dipotong atau dibulatkan. Untuk jenis integral, hal ini berarti rentang jenis sumber adalah subset yang tepat dari rentang untuk jenis target. Misalnya, variabel berjenis panjang (bilangan bulat 64-bit) dapat menyimpan nilai apa pun yang dapat disimpan oleh int (bilangan bulat 32-bit). Dalam contoh berikut, kompilator 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 dasar langsung atau tidak langsung atau antarmuka. 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, pengkompilasi mengharuskan Anda melakukan konversi eksplisit, yang disebut pemeran. Pemeran adalah cara untuk secara eksplisit menginformasikan pengkompilasi bahwa Anda ingin melakukan konversi dan bahwa Anda menyadari kehilangan data mungkin terjadi, atau pemeran mungkin gagal pada waktu proses. Untuk melakukan transmisi, tentukan jenis yang Anda transmisikan dalam tanda kurung di depan nilai atau variabel yang akan dikonversi. Program berikut melemparkan ganda ke int. Program tidak akan dikompilasi tanpa pemeran.

class Test
{
    static void Main()
    {
        double x = 1234.7;
        int a;
        // Cast double to int.
        a = (int)x;
        System.Console.WriteLine(a);
    }
}
// Output: 1234

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

Untuk jenis referensi, konversi eksplisit diperlukan jika Anda perlu mengonversi dari jenis dasar ke jenis turunan:

// Create a new derived type.
Giraffe g = new Giraffe();

// Implicit conversion to base type is safe.
Animal a = g;

// Explicit conversion is required to cast back
// to derived type. Note: This will compile but will
// throw an exception at run time if the right-side
// object is not in fact a Giraffe.
Giraffe g2 = (Giraffe)a;

Operasi transmisi antara jenis referensi tidak mengubah jenis run-time objek yang mendasarinya; hanya mengubah jenis nilai yang digunakan sebagai referensi ke objek tersebut. Untuk informasi selengkapnya, lihat Polymorphism.

Ketik pengecualian konversi saat run time

Dalam beberapa konversi jenis referensi, pengkompilasi tidak dapat menentukan apakah cast valid. Dimungkinkan untuk operasi pemeran yang mengkompilasi dengan benar untuk gagal pada waktu proses. Seperti yang ditunjukkan dalam contoh berikut, jenis cast yang gagal pada run time menyebabkan InvalidCastException dilemparkan.

class Animal
{
    public void Eat() => System.Console.WriteLine("Eating.");

    public override string ToString() => "I am an animal.";
}

class Reptile : Animal { }
class Mammal : Animal { }

class UnSafeCast
{
    static void Main()
    {
        Test(new Mammal());

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }

    static void Test(Animal a)
    {
        // System.InvalidCastException at run time
        // Unable to cast object of type 'Mammal' to type 'Reptile'
        Reptile r = (Reptile)a;
    }
}

Metode Test memiliki parameter Animal, sehingga mengonversi argumen a ke Reptile secara eksplisit dapat membuat asumsi yang berbahaya. Lebih aman untuk tidak membuat asumsi, melainkan memeriksa jenisnya. C# menyediakan operator is untuk memungkinkan Anda menguji kompatibilitas sebelum benar-benar melakukan konversi eksplisit. Untuk informasi selengkapnya, lihat Cara mengonversi secara eksplisit dengan aman menggunakan pencocokan pola dan operator apa adanya.

Spesifikasi bahasa C#

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

Lihat juga