Bir yöntem veya işleç bağımsız değişkeninin gerekli türde olmadığı birçok bağlamda, C # derleyicisi örtük bir tür dönüştürme gerçekleştirmeye çalışır. Derleyici tüm argümanları operatörlerini ve yöntemlerini örtük dönüşümler ekleyerek tatmin edebilirse, bazı durumlarda (özellikle eşitlik testleriyle!) Sonuçlar şaşırtıcı olsa da, bunu şikayetsiz olarak yapar.
Ayrıca, örneğin her tür değer türü int
veya short
aslında bir tür değer ve bir tür nesne (*) tanımlamaktadır. Örtük dönüşümler, değerleri diğer değer türlerine dönüştürmek ve her türlü değeri karşılık gelen nesne türüne dönüştürmek için mevcuttur, ancak farklı nesne türleri örtük olarak birbirine dönüştürülemez.
Biri kullanıyorsa ==
bir karşılaştırma operatörü short
ve bir int
, short
örtük bir dönüştürülecektir int
. Sayısal değerini eşit ise int
, int
bu eşit olacaktır dönüştürüldü hangi int
karşılaştırıldığı edildiği. Bununla birlikte, Equals
bir yöntemi kısa bir yöntemle karşılaştırmak için kullanmaya çalışırsa, yöntemin int
aşırı yüklenmesini karşılayacak tek örtülü dönüşüm Equals
, karşılık gelen nesne türüne dönüştürme olacaktır int
. Girilen short
nesneyle eşleşip eşleşmediği sorulduğunda, söz konusu nesnenin bir int
değil de olduğunu gözlemleyecek short
ve bu nedenle muhtemelen eşit olamayacağı sonucuna varacaktır.
Genel olarak, derleyici bundan şikayet etmese de, aynı tipte olmayan şeyleri karşılaştırmaktan kaçınmalıdır; bir şeylerin ortak bir forma dönüştürülmesinin aynı sonucu verip vermeyeceği ile ilgileniyorsa, bu dönüşümü açıkça gerçekleştirmelidir. Örneğin,
int i = 16777217;
float f = 16777216.0f;
Console.WriteLine("{0}", i==f);
Birini int
a ile karşılaştırmak isteyebileceğiniz üç yol vardır float
. Birisi bilmek isteyebilir:
- Maça mümkün olan en yakın
float
değer ?int
float
float
Maçın tam sayı kısmı eşleşiyor int
mu?
- Aynı sayısal değeri yapın
int
ve float
temsil edin.
Bir int
ve float
doğrudan karşılaştırmaya çalışırsa , derlenen kod ilk soruyu cevaplar; bununla birlikte programcının amaçladığı şey bu kadar açık değildir. Karşılaştırmanın değiştirilmesi, (float)i == f
ilk anlamın amaçlandığını açıklığa kavuşturacak veya (double)i == (double)f
kodun üçüncü soruyu cevaplamasına neden olacaktır (ve amaçlananın bu olduğunu açıklığa kavuşturacaktır).
(*) C # özelliği, türün değerini örneğin System.Int32
bir nesne türü olarak görse bile System.Int32
, bu tür bir görünüm, özellikleri farklı evrenlerde yaşayan değerleri ve nesneleri gören bir platformda kodun çalışmasıyla çelişir. Ayrıca, T
bir referans tipi ve x
a ise T
, o zaman bir tip referansı referans T
verebilmelidir x
. Değişken Böylece, v
Çeşidi Int32
bir tutar Object
, tip bir referans Object
bir referans tutmak mümkün olmalıdır v
ve içeriği. Aslında, bir tür referansı, kendisinden veya içeriğinden Object
kopyalanan v
, ancak kopyalanan verileri tutan bir nesneye işaret edebilir v
. Bu, hiçbirininv
ne de içeriği gerçekten bir Object
.