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 int
atau short
benar - 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 short
dan a int
, maka short
akan secara implisit dikonversi menjadi int
. Jika nilai numeriknya sama dengan nilai int
, int
yang dikonversi akan sama int
dengan yang dibandingkan. Jika seseorang mencoba menggunakan Equals
metode ini untuk membandingkannya dengan int
, bagaimanapun, satu-satunya konversi implisit yang akan memenuhi kelebihan Equals
metode adalah konversi ke jenis objek yang sesuai dengan int
. Ketika short
ditanya apakah cocok dengan objek yang lewat, ia akan mengamati bahwa objek tersebut adalah int
bukan daripada short
dan 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 int
dengan float
. Orang mungkin ingin tahu:
- Apakah nilai terdekat
float
yang int
cocok dengan cocok float
?
- Apakah bilangan bulat bagian dari
float
pertandingan cocok int
?
- Lakukan
int
dan float
mewakili nilai numerik yang sama.
Jika seseorang mencoba membandingkan int
dan float
secara langsung, kode yang dikompilasi akan menjawab pertanyaan pertama; apakah itu yang dimaksudkan oleh programmer, akan jauh dari jelas. Mengubah perbandingan untuk (float)i == f
memperjelas bahwa makna pertama dimaksudkan, atau (double)i == (double)f
akan menyebabkan kode menjawab pertanyaan ketiga (dan membuatnya jelas itulah yang dimaksudkan).
(*) Sekalipun spec C # menganggap nilai tipe misalnya System.Int32
sebagai 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 T
merupakan tipe referensi, dan x
adalah T
, maka referensi tipe T
harus dapat merujuk x
. Jadi, jika suatu variabel v
bertipe Int32
memegang Object
, suatu referensi bertipe Object
harus dapat menyimpan referensi v
atau isinya. Bahkan, referensi tipe Object
akan dapat menunjuk ke objek yang menyimpan data yang disalin v
, tetapi tidak untuk v
dirinya sendiri atau kontennya. Itu tidak menyarankan keduanyav
atau isinya benar-benar sebuah Object
.