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ü intveya shortaslı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ü shortve bir int, shortörtük bir dönüştürülecektir int. Sayısal değerini eşit ise int, intbu eşit olacaktır dönüştürüldü hangi intkarşılaştırıldığı edildiği. Bununla birlikte, Equalsbir yöntemi kısa bir yöntemle karşılaştırmak için kullanmaya çalışırsa, yöntemin intaşı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 shortnesneyle eşleşip eşleşmediği sorulduğunda, söz konusu nesnenin bir intdeğil de olduğunu gözlemleyecek shortve 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 inta ile karşılaştırmak isteyebileceğiniz üç yol vardır float. Birisi bilmek isteyebilir:
- Maça mümkün olan en yakın
floatdeğer ?intfloat
floatMaçın tam sayı kısmı eşleşiyor intmu?
- Aynı sayısal değeri yapın
intve floattemsil edin.
Bir intve floatdoğ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 == filk anlamın amaçlandığını açıklığa kavuşturacak veya (double)i == (double)fkodun üçü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.Int32bir 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, Tbir referans tipi ve xa ise T, o zaman bir tip referansı referans Tverebilmelidir x. Değişken Böylece, vÇeşidi Int32bir tutar Object, tip bir referans Objectbir referans tutmak mümkün olmalıdır vve içeriği. Aslında, bir tür referansı, kendisinden veya içeriğinden Objectkopyalanan v, ancak kopyalanan verileri tutan bir nesneye işaret edebilir v. Bu, hiçbirininvne de içeriği gerçekten bir Object.