Tür dönüştürme ve tür dönüştürmeleri (C# Programlama Kılavuzu)
C# derleme zamanında statik olarak türe sahip olduğundan, bir değişken bildirildikten sonra, bu tür, değişkenin türüne örtülü olarak dönüştürülebilir olmadığı sürece yeniden bildirlanamaz veya başka bir türe değer atanamaz. Örneğin, string örtülü olarak 'ye dönüştürülmesi int olamaz. Bu nedenle, bir i olarak bildirdikten int sonra aşağıdaki kodda olduğu gibi "Hello" dizesini ona atayamazsiniz:
int i;
// error CS0029: Cannot implicitly convert type 'string' to 'int'
i = "Hello";
Ancak, bazen bir değeri başka bir türün değişken veya yöntem parametresine kopyalamanız gerekir. Örneğin, parametresi olarak türüne sahip bir yönteme geçmeniz gereken bir tamsayı değişkeniniz double olabilir. Veya arabirim türünde bir değişkene bir sınıf değişkeni ataması da gerekir. Bu tür işlemler tür dönüştürmeleri olarak adlandırılan işlemlerdir. C# ile aşağıdaki tür dönüştürmeleri gerçekleştirin:
Örtülü dönüştürmeler: Dönüştürme her zaman başarılı olduğundan ve hiçbir veri kaybedilmayacak olduğundan özel söz dizimi gerekmez. Örnekler arasında küçükten daha büyük tam sayı türlerine dönüştürmeler ve türetilmiş sınıflardan temel sınıflara dönüştürmeler yer almaktadır.
Açık dönüştürmeler (tür dönüştürmeler): Açık dönüştürmeler için bir tür dönüştürme ifadesi gerekir. Dönüştürmede bilgiler kaybolabiliyorsa veya başka nedenlerle dönüştürme başarılı olamayabiliyorsa tür dönüştürme gereklidir. Tipik örnekler, daha az duyarlıklı veya daha küçük bir aralığı olan bir türe sayısal dönüştürme ve temel sınıf örneğin türetilmiş bir sınıfa dönüştürmeyi içerir.
Kullanıcı tanımlı dönüştürmeler: Kullanıcı tanımlı dönüştürmeler, temel sınıf türetilmiş sınıf ilişkisi olmayan özel türler arasında açık ve örtülü dönüştürmeleri etkinleştirmek için tanımladığınız özel yöntemlerle gerçekleştirilir. Daha fazla bilgi için bkz. Kullanıcı tanımlı dönüştürme işleçleri.
Yardımcı sınıflarla dönüştürmeler: Tamsayılar ve nesneler veya onaltılık dizeler ve byte dizileri gibi uyumlu olmayan türler arasında dönüştürme yapmak için sınıfını, sınıfını ve gibi yerleşik sayısal türlerin yöntemlerini System.DateTime System.BitConverter System.Convert
ParseInt32.Parse kullanabilirsiniz. Daha fazla bilgi için bkz. Bir bayt dizisini int'e dönüştürme,Dizeyi sayıya dönüştürme ve Onaltılık dizeler ile sayısal türler arasında dönüştürme.
Örtülü dönüştürmeler
Yerleşik sayısal türler için, depolanmış değer kesilmeden veya yuvarlanmadan değişkene sığana kadar örtülü bir dönüştürme ayarlanabilir. İntegral türler için bu, kaynak türü aralığının hedef tür için aralığın uygun bir alt kümesi olduğu anlamına gelir. Örneğin, uzun (64 bit tamsayı) türünde bir değişken, bir int (32 bit tamsayı) tarafından depolan herhangi bir değeri depolar. Aşağıdaki örnekte, derleyici sağdan değerini türüne atamadan önce örtülü num long olarak türüne bigNum dönüştürür.
// Implicit conversion. A long can
// hold any value an int can hold, and more!
int num = 2147483647;
long bigNum = num;
Tüm örtülü sayısal dönüştürmelerin tam listesi için Yerleşik sayısal dönüştürmeler makalesinde Örtülü sayısal dönüştürmeler bölümüne bakın.
Başvuru türleri için, bir sınıftan doğrudan veya dolaylı temel sınıflarından veya arabirimlerinden herhangi biri için her zaman örtülü bir dönüştürme vardır. Türetilmiş bir sınıf her zaman bir temel sınıfın tüm üyelerini içerdiğinden özel söz dizimi gerekmez.
Derived d = new Derived();
// Always OK.
Base b = d;
Açık dönüştürmeler
Ancak, bir dönüştürme bilgileri kaybetme riski olmadan gerçekleştirilene ise derleyici, tür dönüştürme olarak adlandırılan açık bir dönüştürme gerçekleştirmeniz gerekir. Tür dönüştürme, derleyiciye dönüştürmeyi yapmayı niyetli olduğunu ve veri kaybının olabileceğini veya çalıştırma zamanında başarısız olabileceğinin farkında olduğunu açıkça bildirmenin bir yoludur. Bir tür dönüştürme gerçekleştirmek için, dönüştürülecek değerin veya değişkenin önünde parantez içinde türünü belirtin. Aşağıdaki program, bir int'e bir çifti iletir. Program, cast olmadan derlanmaz.
class Test
{
static void Main()
{
double x = 1234.7;
int a;
// Cast double to int.
a = (int)x;
System.Console.WriteLine(a);
}
}
// Output: 1234
Desteklenen açık sayısal dönüştürmelerin tam listesi için Yerleşik sayısal dönüştürmeler makalesinde Açık sayısal dönüştürmeler bölümüne bakın.
Başvuru türleri için, bir temel türden türetilmiş türe dönüştürmeye ihtiyacınız varsa açık bir tür dönüştürme gereklidir:
// Create a new derived type.
Giraffe g = new Giraffe();
// Implicit conversion to base type is safe.
Animal a = g;
// Explicit conversion is required to cast back
// to derived type. Note: This will compile but will
// throw an exception at run time if the right-side
// object is not in fact a Giraffe.
Giraffe g2 = (Giraffe)a;
Başvuru türleri arasındaki bir tür değiştirme işlemi, temel alınan nesnenin çalışma zamanı türünü değiştirmez; yalnızca bu nesneye başvuru olarak kullanılan değerin türünü değiştirir. Daha fazla bilgi için bkz. Çok biçimlilik.
Çalışma zamanında tür dönüştürme özel durumları
Bazı başvuru türü dönüştürmelerde, derleyici bir tür dönüştürmenin geçerli olup olmadığını belirleye değildir. Çalışma zamanında düzgün bir şekilde derlenmiş bir cast işlemi başarısız olabilir. Aşağıdaki örnekte gösterildiği gibi, çalışma zamanında başarısız olan bir tür tür atma bir neden InvalidCastException olur.
class Animal
{
public void Eat() => System.Console.WriteLine("Eating.");
public override string ToString() => "I am an animal.";
}
class Reptile : Animal { }
class Mammal : Animal { }
class UnSafeCast
{
static void Main()
{
Test(new Mammal());
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
static void Test(Animal a)
{
// System.InvalidCastException at run time
// Unable to cast object of type 'Mammal' to type 'Reptile'
Reptile r = (Reptile)a;
}
}
yöntemi bir parametresine sahip olduğu için bağımsız değişkeni açıkça bir değişkenine Test Animal a atarak Reptile tehlikeli bir varsayımda bulunarak. Varsayımlarda bulunarak değil türü kontrol etmek daha güvenlidir. C#, gerçekten bir cast gerçekleştirmeden önce uyumluluğu test etmek için is işleci sağlar. Daha fazla bilgi için bkz. Desen eşleştirme ve gibi ve işleçlerini kullanarak güvenli bir şekilde cast işlemi.
C# dili belirtimi
Daha fazla bilgi için C# dil belirtimlerinin Dönüşümler bölümüne bakın.