Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
'type' türü örtük olarak 'type' türüne dönüştürülemiyor
Derleyici açık bir dönüştürme gerektirir. Örneğin, bir r-değerini l değeriyle aynı türde olacak şekilde atamanız gerekebilir. Alternatif olarak, belirli işleç aşırı yüklemelerini desteklemek için dönüştürme yordamları sağlamanız gerekir.
Dönüştürmeler, bir türün değişkenini farklı türde bir değişkene atarken gerçekleşmelidir. Farklı türlerdeki değişkenler arasında atama yapılırken, derleyicinin atama işlecinin sağ tarafındaki türü atama işlecinin sol tarafındaki türe dönüştürmesi gerekir. Aşağıdaki kodu alın:
int i = 50;
long lng = 100;
i = lng;
i = lng;
atama yapar, ancak atama işlecinin sol ve sağ tarafındaki değişkenlerin veri türleri eşleşmiyor. Atamayı yapmadan önce derleyici, uzun türünde olan değişkenini lng
örtük olarak bir int'e dönüştürür. Derleyiciye bu dönüştürmeyi gerçekleştirmesi için açıkça hiçbir kod yönerge vermediğinden bu örtük bir işlemdir. Bu kodla ilgili sorun, bunun bir daraltma dönüştürmesi olarak kabul edilmesi ve olası veri kaybı olabileceğinden derleyicinin örtük daraltma dönüştürmelerine izin vermemesidir.
Bellekte dönüştürme yaptığımız veri türünden daha az depolama alanı kaplayan bir veri türüne dönüştürülürken bir daraltma dönüştürmesi vardır. Örneğin, uzun bir int'i bir int'e dönüştürmek, daraltma dönüştürmesi olarak kabul edilir. Uzun, 8 bayt bellek, bir int ise 4 bayt kaplar. Veri kaybının nasıl gerçekleşebileceğini görmek için aşağıdaki örneği göz önünde bulundurun:
int i = 50;
long lng = 3147483647;
i = lng;
Değişkeni lng
artık çok büyük olduğundan değişkende i
depolanamayan bir değer içeriyor. Bu değeri bir int türüne dönüştürmemiz durumunda bazı verilerimiz kaybedilir ve dönüştürülen değer dönüştürmeden önceki değerle aynı olmaz.
Genişletme dönüştürmesi, daraltma dönüştürmesinin tersi olabilir. Genişletme dönüştürmeleriyle, dönüştürme yaptığımız veri türünden daha fazla depolama alanı kaplayan bir veri türüne dönüştürüyoruz. Genişletme dönüştürme örneği aşağıda verilmiştir:
int i = 50;
long lng = 100;
lng = i;
Bu kod örneği ile ilk kod arasındaki farka dikkat edin. Bu kez değişken lng
atama işlecinin sol tarafında olduğundan atamamızın hedefidir. Atamanın yapılabilmesi için önce derleyicinin int türünde olan değişkenini i
örtük olarak uzun yazacak şekilde dönüştürmesi gerekir. Bu, 4 bayt bellek (int) alan bir türden 8 bayt bellek (uzun) kaplayan bir türe dönüştürdüğümizden, bu bir genişletme dönüştürme işlemidir. Olası veri kaybı olmadığından örtük genişletme dönüştürmelerine izin verilir. Bir int içinde depolanabilen tüm değerler de uzun bir süre içinde depolanabilir.
Örtük daraltma dönüştürmelerine izin verilmediğini biliyoruz, bu nedenle bu kodu derleyebilmek için veri türünü açıkça dönüştürmemiz gerekiyor. Açık dönüştürmeler, atama kullanılarak yapılır. Atama, C# dilinde bir veri türünün diğerine dönüştürülmesini açıklamak için kullanılan terimdir. Derlenecek kodu almak için aşağıdaki söz dizimini kullanmamız gerekir:
int i = 50;
long lng = 100;
i = (int) lng; // Cast to int.
Üçüncü kod satırı, derleyiciye atamayı yapmadan önce uzun türünde olan değişkenini lng
açıkça bir int'e dönüştürmesini söyler. Daraltma dönüştürmesi ile olası veri kaybı olduğunu unutmayın. Daraltma dönüştürmeleri dikkatle kullanılmalıdır ve kod derlenecek olsa bile çalışma zamanında beklenmeyen sonuçlar alabilirsiniz.
Bu tartışma yalnızca değer türleri için yapılmıştır. Değer türleriyle çalışırken, değişkende depolanan verilerle doğrudan çalışırsınız. Bununla birlikte, .NET'in de başvuru türleri vardır. Başvuru türleriyle çalışırken, gerçek verilerle değil, bir değişkene başvuruyla çalışıyorsunuz. Başvuru türlerine örnek olarak sınıflar, arabirimler ve diziler verilebilir. Derleyici belirli bir dönüştürmeye izin vermediği veya uygun dönüştürme işleçleri uygulanmadığı sürece, bir başvuru türünü örtük olarak veya açıkça başka bir başvuru türüne dönüştüremezsiniz.
Aşağıdaki örnek CS0029 oluşturur:
// CS0029.cs
public class MyInt
{
private int x = 0;
// Uncomment this conversion routine to resolve CS0029.
/*
public static implicit operator int(MyInt i)
{
return i.x;
}
*/
public static void Main()
{
var myInt = new MyInt();
int i = myInt; // CS0029
}
}