Dalam banyak konteks di mana metode atau argumen operator bukan dari tipe yang diperlukan, kompiler C # akan berusaha untuk melakukan konversi tipe implisit. Jika kompiler dapat membuat semua argumen memuaskan operator dan metode mereka dengan menambahkan konversi implisit, ia akan melakukannya tanpa keluhan, meskipun dalam beberapa kasus (terutama dengan tes kesetaraan!) Hasilnya mungkin mengejutkan.
Selanjutnya, setiap tipe nilai seperti intatau shortbenar - benar menggambarkan baik jenis nilai maupun jenis objek (*). Konversi tersirat ada untuk mengkonversi nilai ke jenis nilai lainnya, dan untuk mengkonversi segala jenis nilai ke jenis objek yang sesuai, tetapi berbagai jenis objek tidak secara implisit dapat dikonversi satu sama lain.
Jika seseorang menggunakan ==operator untuk membandingkan a shortdan a int, maka shortakan secara implisit dikonversi menjadi int. Jika nilai numeriknya sama dengan nilai int, intyang dikonversi akan sama intdengan yang dibandingkan. Jika seseorang mencoba menggunakan Equalsmetode ini untuk membandingkannya dengan int, bagaimanapun, satu-satunya konversi implisit yang akan memenuhi kelebihan Equalsmetode adalah konversi ke jenis objek yang sesuai dengan int. Ketika shortditanya apakah cocok dengan objek yang lewat, ia akan mengamati bahwa objek tersebut adalah intbukan daripada shortdan dengan demikian menyimpulkan bahwa itu tidak mungkin sama.
Secara umum, meskipun kompiler tidak akan mengeluh tentang hal itu, orang harus menghindari membandingkan hal-hal yang tidak dari jenis yang sama; jika seseorang tertarik pada apakah konversi sesuatu ke bentuk umum akan memberikan hasil yang sama, ia harus melakukan konversi seperti itu secara eksplisit. Pertimbangkan, misalnya,
int i = 16777217;
float f = 16777216.0f;
Console.WriteLine("{0}", i==f);
Ada tiga cara di mana seseorang mungkin ingin membandingkan intdengan float. Orang mungkin ingin tahu:
- Apakah nilai terdekat
floatyang intcocok dengan cocok float?
- Apakah bilangan bulat bagian dari
floatpertandingan cocok int?
- Lakukan
intdan floatmewakili nilai numerik yang sama.
Jika seseorang mencoba membandingkan intdan floatsecara langsung, kode yang dikompilasi akan menjawab pertanyaan pertama; apakah itu yang dimaksudkan oleh programmer, akan jauh dari jelas. Mengubah perbandingan untuk (float)i == fmemperjelas bahwa makna pertama dimaksudkan, atau (double)i == (double)fakan menyebabkan kode menjawab pertanyaan ketiga (dan membuatnya jelas itulah yang dimaksudkan).
(*) Sekalipun spec C # menganggap nilai tipe misalnya System.Int32sebagai objek tipe System.Int32, pandangan seperti itu bertentangan dengan persyaratan bahwa kode dijalankan pada platform yang specnya menganggap nilai dan objek sebagai penghuni alam semesta yang berbeda. Selanjutnya, jika Tmerupakan tipe referensi, dan xadalah T, maka referensi tipe Tharus dapat merujuk x. Jadi, jika suatu variabel vbertipe Int32memegang Object, suatu referensi bertipe Objectharus dapat menyimpan referensi vatau isinya. Bahkan, referensi tipe Objectakan dapat menunjuk ke objek yang menyimpan data yang disalin v, tetapi tidak untuk vdirinya sendiri atau kontennya. Itu tidak menyarankan keduanyavatau isinya benar-benar sebuah Object.