Tür dönüştürmeleri ve tür dönüştürmeleri (C# Programlama Kılavuzu)

C# derleme zamanında statik olarak türünde olduğundan, bir değişken bildirildikten sonra, bu tür değişkenin türüne örtük olarak dönüştürülebilir olmadığı sürece yeniden bildirilemez veya başka bir türde bir değer atanamaz. Örneğin, string örtük olarak dönüştürülemez int. Bu nedenle, olarak intbildirdikten i sonra, aşağıdaki kodda gösterildiği gibi "Hello" dizesini bu dizeye atayamazsınız:

int i;

// error CS0029: can't implicitly convert type 'string' to 'int'
i = "Hello";

Ancak, bazen bir değeri başka bir türe ait bir değişkene veya yöntem parametresine kopyalamanız gerekebilir. Örneğin, parametresi olarak doubleyazılan bir yönteme geçirmeniz gereken bir tamsayı değişkeniniz olabilir. Veya bir arabirim türünün değişkenine sınıf değişkeni atamanız gerekebilir. Bu tür işlemler tür dönüştürmeleri olarak adlandırılır. C# dilinde aşağıdaki dönüştürme türlerini gerçekleştirebilirsiniz:

  • Örtük dönüştürmeler: Dönüştürme her zaman başarılı olduğundan ve veri kaybı olmadığından özel bir söz dizimi gerekmez. Örnek olarak 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 verilebilir.

  • Açık dönüştürmeler (atamalar): Açık dönüştürmeler bir atama ifadesi gerektirir. Dönüştürmede bilgi kaybolabileceği veya dönüştürmenin başka nedenlerle başarılı olmayabileceği durumlarda atama gereklidir. Tipik örnekler arasında daha az duyarlığa veya daha küçük bir aralığa sahip bir türe sayısal dönüştürme ve temel sınıf örneğinin türetilmiş bir sınıfa dönüştürülmesi verilebilir.

  • 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ük dönüştürmeleri etkinleştirmek için tanımlayabileceğiniz özel yöntemler kullanır. 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 System.DateTime bayt dizileri gibi uyumlu olmayan türler arasında dönüştürme yapmak için sınıfını, System.Convert sınıfını ve Parse gibi Int32.Parseyerleşik sayısal türlerin yöntemlerini kullanabilirsinizSystem.BitConverter. Daha fazla bilgi için bkz . Bayt dizisini int'e dönüştürme, Dizeyi sayıya dönüştürme ve Onaltılık dizelerle sayısal türler arasında dönüştürme.

Örtük dönüştürmeler

Yerleşik sayısal türler için, depolanacak değer kırpılmadan veya yuvarlanmadan değişkene sığabildiğinde örtük dönüştürme yapılabilir. Tam sayı türleri 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, long (64 bit tamsayı) türünde bir değişken, int (32 bit tamsayı) tarafından depolanabilir herhangi bir değeri depolayabilir. Aşağıdaki örnekte, derleyici sağdaki değerini num türüne long atamadan bigNumönce örtük olarak 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ük sayısal dönüştürmelerin tam listesi için Yerleşik sayısal dönüştürmeler makalesinin Örtük sayısal dönüştürmeler bölümüne bakın.

Başvuru türleri için, örtük dönüştürme her zaman bir sınıftan doğrudan veya dolaylı temel sınıflarından veya arabirimlerinden herhangi birine var olur. 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, bilgi kaybı riski olmadan dönüştürme yapılamazsa, derleyici atama olarak adlandırılan açık bir dönüştürme gerçekleştirmenizi gerektirir. Atama, derleyiciye dönüştürmeyi amaçladığınızı ve veri kaybı olabileceğini veya atamanın çalışma zamanında başarısız olabileceğini fark ettiğinizi açıkça bildirmenin bir yoludur. Bir atama gerçekleştirmek için, dönüştürülecek değerin veya değişkenin önündeki parantez içinde atama yaptığınız türü belirtin. Aşağıdaki program bir çifti int'e yayınlar. Program, atama olmadan derlenmez.

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 makalesinin 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ürmeniz gerekiyorsa açık bir atama 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 atama 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 . Polimorfizm.

Çalışma zamanında tür dönüştürme özel durumları

Bazı başvuru türü dönüştürmelerinde, derleyici bir atamanın geçerli olup olmadığını belirleyemez. Doğru derlenen bir atama işleminin çalışma zamanında başarısız olması mümkündür. Aşağıdaki örnekte gösterildiği gibi, çalışma zamanında başarısız olan bir tür ataması bir InvalidCastException atılması neden 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öntemin Test bir Animal parametresi vardır, bu nedenle bağımsız değişkeni a açıkça ' Reptile a ataması tehlikeli bir varsayımda bulunur. Varsayımlarda bulunmak yerine türünü denetlemek daha güvenlidir. C# bir atama gerçekleştirmeden önce uyumluluğu test etmenizi sağlayan is işlecini sağlar. Daha fazla bilgi için bkz . Desen eşleştirme ve as ve is işleçlerini kullanarak güvenli bir şekilde atama.

C# dili belirtimi

Daha fazla bilgi için C# dil belirtiminin Dönüştürmeler bölümüne bakın.

Ayrıca bkz.