Farklı Türlerin Birbirine Atanması

Atama terimi açıkça yapılan atamaları, metod çağırmasıyla yapılan atamaları ve return işlemiyle yapılan atamaları içeren genel bir terimdir. Bir atama işlemince derleyici sağ tarafta ki ifadenin türünü otomatik olarak sol tarafın türüne dönüştürür ve atamayı ondan sonra yapar. Dolayısıyla T1 türünden T2 türüne doğrudan atama yapılabilmesi için T1 türünden T2 türüne doğrudan dönüştürmenin varolması gerekir. (Yani örneğin; int türünden long türüne atama yapılabilmesi demek int türünden long türüne otomatik dönüştürmenin olması demektir.
Genel olarak C#’ta küçük türden büyük türe atama yapılabilmesine rağmen tersi geçersizdir. Tür kontrolü derleme zamanında yapılır. Büyük türün içinde ki değer küçük türürün sınırlarında kalıyor olsa bile bu derleme aşamasında anlaşılacağı için program baştan hata verir. Atanan değere değil türlere bakılacağı için hata verir.
Küçük türün büyük türe atanması aslında özet bir kuraldır. Bu kuralın bazı ayrıntıları vardır:
1. Tam sayı türlerinden gerçek sayı türlerine doğrudan atama yapılabilir ancak gerçek sayı türünden tam sayı türüne doğrudan atama yapılamaz. Tam sayı türlerinden gerçek sayı türlerine yapılan atamalarda bilgi kaybı riski vardır fakat kayıp basamaksal düzeyde değil mantis düzeyindedir.
2. Küçük işaretli tam sayı türünden, büyük işaretsiz tam sayı türüne doğrudan atama yapılamaz. Örneğin; int bir tür ulong türüne atanamaz. Aynı durum aynı türün işaretli ve işaretsiz türlerinde de geçerli olur. Ne int, uint türüne ne de uint, int türüne atama yapılamaz. Ancak küçük işaretsiz tam sayı türünden, büyük işaretli tam sayı türüne doğrudan atama yapılabilir. Örneğin; uint türünden long türüne doğrudan atama yapılabilir.
3. float ve double türünden decimal türüne doğrudan atama yoktur. Aynı biçimde decimal türünden de float ve double türlerine doğrudan atama yoktur.
4. Hiçbir türden bool türüne, bool türünden de hiçbir türe doğrudan dönüştürme yoktur.
5. Anımsanacağı gibi C#’ta sbyte , bytei short ve u short türünden sabit yoktur.

Byte b = 10 ;

İşte yukarıda ki atamanın mümkün hale getirebilmesi için şöyle bir kural daha eklenmiştir. İnt türünden bir sabit ifadesi atanan değer heder türün sınırları içerisinde kalmak koşuluyla doğrudan sbyte , byte , short , ushort , uint ve ulong türlerine doğrudan atanabilir. Bu durumda örneğin :

Byte = b ;
B = 10 ;

Burada 10 int türden bir sabit ifadesidir ve byte sınırları içerisinde kalmaktadır o halde atama geçerlidir. Çünkü burada atanan değer sabit ifadesi değildir. -10 sabit ifadesi olmasına rağmen byte sınırları içinde kalmamaktadır bu nedenle hata oluşur. Bu kurala ek olarak ayrıca şöyle bir kuralda eklenmiştir :
Long türden bir sabit ifadesi değer hedef türün sınıtlarında kalmak koşuluyla ulong türüne doğrudan atanabilir.
Hangi türlerden hangi türlere atama yapılabileceği, bir sonuç tablosuyla gösterilebilir.

sbyte –> short, int, long, float, double or decimal
byte –> short, ushort, int, uint, long, ulong, float, double or decimal
short –> int, long, float, double or decimal
ushort –> int, uint, long, ulong, float, double or decimal
int –> long, float, double or decimal
uint –> long, ulong, float, double or decimal
long –> float, double or decimal
ulong –> float, double or decimal
char –> ushort, int, uint, long, ulong, float, double or decimal
float –> double

Leave a Reply

Site Footer