Aracılığıyla paylaş


Visual Basic'te dönüştürmeler

Dönüştürme, bir değeri bir türden diğerine değiştirme işlemidir. Örneğin, türündeki Integer bir değer türünde Doublebir değere dönüştürülebilir veya türündeki Derived bir değer türüne Basedönüştürülebilir. Bunun ve Derived her ikisi de sınıf olduğu ve Derived öğesinden Basedevraldığı varsayılırBase. Dönüştürmeler, değerin kendisinin değişmesini gerektirmeyebilir (ikinci örnekte olduğu gibi) veya değer gösteriminde önemli değişiklikler gerektirebilir (önceki örnekte olduğu gibi).

Dönüştürmeler genişletilebilir veya daraltılabilir. Genişletme dönüştürmesi, değer etki alanı özgün türün değer etki alanından daha büyük değilse en az büyük olan türden başka bir türe dönüştürmedir. Genişletme dönüştürmeleri hiçbir zaman başarısız olmamalıdır. Daraltma dönüştürmesi, değer etki alanı özgün türün değer etki alanından daha küçük olan bir türden başka bir türe dönüştürme işlemidir veya dönüştürme yapılırken (örneğin, türünden öğesine dönüştürürken IntegerString) ek özen gösterilmesi gerektiği yeterince ilgisizdir. Bilgi kaybına neden olabilecek daraltma dönüştürmeleri başarısız olabilir.

Kimlik dönüştürmesi (bir türden kendisine dönüştürme) ve varsayılan değer dönüştürmesi (yani dönüştürme) Nothingtüm türler için tanımlanır.

Kapalı ve Açık Dönüştürmeler

Dönüştürmeler örtük veya açık olabilir. Örtük dönüştürmeler özel bir söz dizimi olmadan gerçekleşir. Aşağıda, bir değerin bir değere örtük olarak dönüştürülmesi Integer örneği verilmiştir Long :

Module Test
    Sub Main()
        Dim intValue As Integer = 123
        Dim longValue As Long = intValue

        Console.WriteLine(intValue & " = " & longValue)
    End Sub
End Module

Öte yandan, açık dönüştürmeler için atama işleçleri gerekir. Tür işleci olmayan bir değer üzerinde açık dönüştürme yapmaya çalışmak derleme zamanı hatasına neden olur. Aşağıdaki örnek, bir değeri bir değere dönüştürmek için açık bir LongInteger dönüştürme kullanır.

Module Test
    Sub Main()
        Dim longValue As Long = 134
        Dim intValue As Integer = CInt(longValue)

        Console.WriteLine(longValue & " = " & intValue)
    End Sub
End Module

Örtük dönüştürme kümesi derleme ortamına ve deyimine Option Strict bağlıdır. Katı semantikler kullanılıyorsa, yalnızca genişletme dönüştürmeleri örtük olarak gerçekleşebilir. İzin veren semantikler kullanılıyorsa, tüm genişletme ve daraltma dönüştürmeleri (diğer bir deyişle tüm dönüştürmeler) örtük olarak gerçekleşebilir.

Boole Dönüştürmeleri

Boolean Sayısal bir tür olmasa da, numaralandırılmış bir tür gibi sayısal türlere ve sayı türlerinden daraltma dönüştürmeleri vardır. Değişmez değerTrue, için , UShort65535UInteger4294967295 için , ULong18446744073709551615 için , ve ifadesinde , Short, Integer, Long, , Decimal, Singleve Doubleifadelerine -1SBytedönüştürülür.255Byte Değişmez değer False , değişmez 0değerine dönüştürülür. Sıfır sayısal değer değişmez Falsedeğerine dönüştürülür. Diğer tüm sayısal değerler değişmez değerine Truedönüştürülür.

Boole'dan String'e daraltma dönüştürmesi var ve ya da System.Boolean.TrueStringSystem.Boolean.FalseStringöğesine dönüştürülüyor. ile arasında bir daraltma dönüştürmesi StringBooleande vardır: dize veya FalseString değerine eşitse TrueString (geçerli kültürde büyük/küçük harfe duyarsız olarak) uygun değeri kullanır; aksi takdirde dizeyi sayısal bir tür olarak ayrıştırmaya çalışır (mümkünse onaltılık veya sekizli olarak, başka bir şekilde kayan değer olarak) ve yukarıdaki kuralları kullanır; aksi takdirde oluştururSystem.InvalidCastException.

Sayısal Dönüştürmeler

, , , , UIntegerSByteUShortLongSingleShortIntegerULongDecimalve ve Doubletürleri Byteile tüm numaralandırılmış türler arasında sayısal dönüştürmeler vardır. Dönüştürülürken, numaralandırılmış türler temel türleriymiş gibi kabul edilir. Numaralandırılmış türe dönüştürülürken, kaynak değerin numaralandırılmış türde tanımlanan değer kümesine uyması gerekmez. Örneğin:

Enum Values
    One
    Two
    Three
End Enum

Module Test
    Sub Main()
        Dim x As Integer = 5

        ' OK, even though there is no enumerated value for 5.
        Dim y As Values = CType(x, Values)
    End Sub
End Module

Sayısal dönüştürmeler çalışma zamanında aşağıdaki gibi işlenir:

  • Sayısal bir türden daha geniş bir sayısal türe dönüştürme için, değer yalnızca daha geniş bir türe dönüştürülür. , , , , veya veya SingleDecimalDouble dönüştürmeleri UIntegeren DoubleSingle yakın veya değere yuvarlanir. LongULongInteger Bu dönüştürme duyarlık kaybına neden olsa da, hiçbir zaman büyüklük kaybına neden olmaz.

  • Bir tamsayı türünden başka bir tamsayı türüne veya Single, DoubleDecimal veya tamsayı türüne dönüştürme için, sonuç tamsayı taşma denetiminin açık olup olmadığına bağlıdır:

    Tamsayı taşması denetleniyorsa:

    • Kaynak tamsayı türündeyse, kaynak bağımsız değişkeni hedef türün aralığı içindeyse dönüştürme başarılı olur. Kaynak bağımsız değişkeni hedef türün aralığının dışındaysa dönüştürme bir System.OverflowException özel durum oluşturur.

    • Kaynak Single, Doubleveya Decimalise, kaynak değer en yakın tam sayı değerine yukarı veya aşağı yuvarlanır ve bu tam sayı değeri dönüştürmenin sonucu olur. Kaynak değer iki tam sayı değerine eşit olarak yakınsa, değer en az önemli basamak konumunda çift sayıya sahip değere yuvarlanir. Sonuçta elde edilen tam sayı değeri hedef türün aralığının dışındaysa, bir System.OverflowException özel durum oluşturulur.

    Tamsayı taşması denetlenmiyorsa:

    • Kaynak tam sayı türündeyse, dönüştürme her zaman başarılı olur ve yalnızca kaynak değerin en önemli bitlerini atarak oluşur.

    • Kaynak , Doubleveya Decimalise Singledönüştürme her zaman başarılı olur ve kaynak değeri en yakın tam sayı değerine yuvarlamaktan oluşur. Kaynak değer iki tam sayı değerine eşit olarak yakınsa, değer her zaman en az önemli basamak konumunda çift sayıya sahip değere yuvarlanir.

  • 'den değerine DoubleSingleDouble dönüştürme için, değer en Single yakın değere yuvarlanir. Double Değer olarak Singletemsil etmek için çok küçükse, sonuç pozitif sıfır veya negatif sıfır olur. Double Değer olarak Singletemsil edilemeyecek kadar büyükse, sonuç pozitif sonsuz veya negatif sonsuz olur. Double değer iseNaN, sonuç da NaNolur.

  • veya 'den Single dönüştürme içinDecimal, kaynak değer gösterime Decimal dönüştürülür ve gerekirse 28. ondalık basamaktan sonra en yakın sayıya yuvarlanir.Double Kaynak değer olarak Decimaltemsil etmek için çok küçükse, sonuç sıfır olur. Kaynak değer NaN, sonsuz veya olarak temsil Decimaledilemeyecek kadar büyükse bir System.OverflowException özel durum oluşturulur.

  • 'den değerine DoubleSingleDouble dönüştürme için, değer en Single yakın değere yuvarlanir. Double Değer olarak Singletemsil etmek için çok küçükse, sonuç pozitif sıfır veya negatif sıfır olur. Double Değer olarak Singletemsil edilemeyecek kadar büyükse, sonuç pozitif sonsuz veya negatif sonsuz olur. Double değer iseNaN, sonuç da NaNolur.

Başvuru Dönüştürmeleri

Başvuru türleri bir temel türe dönüştürülebilir ve bunun tersi de geçerlidir. Temel türden daha türetilmiş bir türe dönüştürmeler ancak dönüştürülen değer null bir değer, türetilmiş türün kendisi veya daha türetilmiş bir türse çalışma zamanında başarılı olur.

Sınıf ve arabirim türleri herhangi bir arabirim türüne ve herhangi bir arabirim türünden yayınlanabilir. Bir tür ile arabirim türü arasındaki dönüştürmeler yalnızca söz konusu gerçek türlerin devralma veya uygulama ilişkisi varsa çalışma zamanında başarılı olur. Arabirim türü her zaman türünden Objecttüretilen bir örnek içereceği için, arabirim türü de her zaman 'a ve 'den Objecttüretilebilir.

Not. COM sınıflarını temsil eden sınıfların çalışma zamanına kadar bilinmeyen arabirim uygulamaları olabileceğinden, sınıfları uygulamadığı arabirimlere ve arabirimlerden dönüştürmek NotInheritable bir hata değildir.

Bir başvuru dönüştürmesi çalışma zamanında başarısız olursa, bir System.InvalidCastException özel durum oluşturulur.

Başvuru Varyansı Dönüştürmeleri

Genel arabirimler veya temsilciler, türün uyumlu varyantları arasında dönüştürmelere izin veren değişken türü parametrelerine sahip olabilir. Bu nedenle, çalışma zamanında bir sınıf türünden veya arabirim türünden devraldığı veya uyguladığı arabirim türüyle uyumlu bir arabirim türüne dönüştürme başarılı olur. Benzer şekilde, temsilci türleri değişken uyumlu temsilci türlerine ve bu türlerden türlere atanabilir. Örneğin, temsilci türü

Delegate Function F(Of In A, Out R)(a As A) As R

, 'den öğesine F(Of Object, Integer) dönüştürmeye F(Of String, Integer)izin verir. Yani, alan Object bir temsilciF, alan Stringbir temsilci F olarak güvenle kullanılabilir. Temsilci çağrıldığında hedef yöntem bir nesne bekler ve dize bir nesnedir.

Genel bir temsilci veya arabirim türününS(Of S1,...,Sn), genel bir arabirim veya temsilci türüyle T(Of T1,...,Tn)uyumlu olduğu söylenir:

  • S ve T her ikisi de aynı genel türünden U(Of U1,...,Un)oluşturulur.

  • Her tür parametresi Uxiçin:

    • Tür parametresi varyans Sx olmadan bildirildiyse ve Tx aynı türde olmalıdır.

    • tür parametresi bildirildiyse In , için bir genişletme kimliği, varsayılan, başvuru, dizi veya tür parametresi dönüştürmesi SxTxolmalıdır.

    • tür parametresi bildirildiyse Out , için bir genişletme kimliği, varsayılan, başvuru, dizi veya tür parametresi dönüştürmesi TxSxolmalıdır.

Bir sınıftan değişken türü parametrelerine sahip genel bir arabirime dönüştürürken, sınıf birden fazla değişken uyumlu arabirim uygularsa, değişken olmayan bir dönüştürme yoksa dönüştürme belirsizdir. Örneğin:

Class Base
End Class

Class Derived1
    Inherits Base
End Class

Class Derived2
    Inherits Base
End Class

Class OneAndTwo
    Implements IEnumerable(Of Derived1)
    Implements IEnumerable(Of Derived2)
End Class

Class BaseAndOneAndTwo
    Implements IEnumerable(Of Base)
    Implements IEnumerable(Of Derived1)
    Implements IEnumerable(Of Derived2)
End Class

Module Test
    Sub Main()
        ' Error: conversion is ambiguous
        Dim x As IEnumerable(Of Base) = New OneAndTwo()

        ' OK, will pick up the direct implementation of IEnumerable(Of Base)
        Dim y as IEnumerable(Of Base) = New BaseAndOneAndTwo()
    End Sub
End Module

Anonim Temsilci Dönüştürmeleri

Lambda yöntemi olarak sınıflandırılan bir ifade, hedef türün (örneğin, Dim x = Function(a As Integer, b As Integer) a + b) olmadığı veya hedef türün temsilci türü olmadığı bir bağlamda bir değer olarak yeniden sınıflandırıldığında, sonuçta elde edilen ifadenin türü lambda yönteminin imzasına eşdeğer anonim bir temsilci türüdür. Bu anonim temsilci türünün herhangi bir uyumlu temsilci türüne dönüştürmesi vardır: Uyumlu bir temsilci türü, anonim temsilci türünün yöntemi parametre olarak olan bir temsilci oluşturma ifadesi kullanılarak oluşturulabilen herhangi bir temsilci türüdür Invoke . Örneğin:

' Anonymous delegate type similar to Func(Of Object, Object, Object)
Dim x = Function(x, y) x + y

' OK because delegate type is compatible
Dim y As Func(Of Integer, Integer, Integer) = x

ve System.MulticastDelegate türlerinin System.Delegate temsilci türleri olarak kabul edilmediğini unutmayın (tüm temsilci türleri bunlardan devralınsa bile). Ayrıca anonim temsilci türünden uyumlu bir temsilci türüne dönüştürmenin bir başvuru dönüştürmesi olmadığını unutmayın.

Dizi Dönüştürmeleri

Dizilerde tanımlanan dönüştürmelerin yanı sıra, bunların başvuru türleri olduğu gerçeğiyle tanımlanır, diziler için çeşitli özel dönüştürmeler vardır.

her iki tür A ve Biçin, her ikisi de başvuru türleri veya değer türleri olarak tanınmayan tür parametreleriyse ve için bir başvuru, dizi veya tür parametresi dönüştürmesi BvarsaA, türünden A bir diziden aynı dereceye sahip bir tür B dizisine dönüştürme vardır. Bu ilişki dizi kovaryans olarak bilinir. Özellikle dizi kovaryans, öğe türü B olan bir dizinin öğesinin, hem hem de A başvuru türleri olması ve BB için başvuru dönüştürmesi veya dizi dönüştürmesi Aolması koşuluyla, öğe türü Aolan bir dizinin öğesi olabileceği anlamına gelir. Aşağıdaki örnekte, öğesinin gerçek öğe türü değil Objectolduğu için ikinci çağrısı F bir System.ArrayTypeMismatchException özel durumun atılması neden bStringolur:

Module Test
    Sub F(ByRef x As Object)
    End Sub

    Sub Main()
        Dim a(10) As Object
        Dim b() As Object = New String(10) {}
        F(a(0)) ' OK.
        F(b(1)) ' Not allowed: System.ArrayTypeMismatchException.
   End Sub
End Module

Dizi kovaryans nedeniyle, başvuru türü dizilerinin öğelerine yapılan atamalar, dizi öğesine atanan değerin aslında izin verilen türde olmasını sağlayan bir çalışma zamanı denetimi içerir.

Module Test
    Sub Fill(array() As Object, index As Integer, count As Integer, _
            value As Object)
        Dim i As Integer

        For i = index To (index + count) - 1
            array(i) = value
        Next i
    End Sub

    Sub Main()
        Dim strings(100) As String

        Fill(strings, 0, 101, "Undefined")
        Fill(strings, 0, 10, Nothing)
        Fill(strings, 91, 10, 0)
    End Sub
End Module

Bu örnekte, yönteminde Fill ataması array(i) örtük olarak değişkeni value tarafından başvurulan nesnenin ya da Nothing dizinin gerçek öğe türüyle arrayuyumlu bir tür örneği olmasını sağlayan bir çalışma zamanı denetimi içerir. yönteminde Main, yöntemin Fill ilk iki çağrısı başarılı olur, ancak üçüncü çağırma, 'a ilk atama yürütülürken bir System.ArrayTypeMismatchException özel durum oluşturmasına array(i)neden olur. Özel durum, bir Integer dizide String depolanamadığından oluşur.

Dizi öğesi türlerinden biri türü çalışma zamanında değer türüne dönüşen bir tür parametresiyse, bir System.InvalidCastException özel durum oluşturulur. Örneğin:

Module Test
    Sub F(Of T As U, U)(x() As T)
        Dim y() As U = x
    End Sub

    Sub Main()
        ' F will throw an exception because Integer() cannot be
        ' converted to Object()
        F(New Integer() { 1, 2, 3 })
    End Sub
End Module

Dizilerin aynı dereceye sahip olması koşuluyla, numaralandırılmış türün bir dizisi ile numaralandırılmış türün temel türündeki bir dizi veya aynı temel türe sahip başka bir numaralandırılmış türün dizisi arasında da dönüştürmeler vardır.

Enum Color As Byte
    Red
    Green
    Blue
End Enum

Module Test
    Sub Main()
        Dim a(10) As Color
        Dim b() As Integer
        Dim c() As Byte

        b = a    ' Error: Integer is not the underlying type of Color
        c = a    ' OK
        a = c    ' OK
    End Sub
End Module

Bu örnekte dizisiColor, 'nin temel türündeki bir dizisine ByteColorve dizisinden dönüştürülür. Ancak, dizinine Integerdönüştürme işlemi, temel alınan türü Colorolmadığından bir hata Integer olacaktır.

Türdeki rank-1 dizisi, A() aşağıdakilerden biri doğru olduğu sürece içinde bulunan System.Collections.Generic, IReadOnlyList(Of B)ICollection(Of B), IReadOnlyCollection(Of B) ve IEnumerable(Of B) koleksiyon arabirimi türlerine IList(Of B)bir dizi dönüştürmesi de içerir:

  • A ve B hem başvuru türleri hem de değer türleri olarak bilinmeyen tür parametreleridir; ve A genişletme başvurusuna, diziye veya tür parametresine dönüştürmeye Bsahiptir; veya
  • A ve B her ikisi de aynı temel türün numaralandırılmış türleridir; veya
  • ve türlerinden AB biri numaralandırılmış tür, diğeri ise temel alınan türdür.

Herhangi bir dereceye sahip A türündeki herhangi bir dizi, genel olmayan koleksiyon arabirimi türlerine IListICollection bir dizi dönüştürmesine de sahiptir ve IEnumerable içinde System.Collectionsbulunur.

kullanarak For Eachveya yöntemleri doğrudan çağırarak GetEnumerator elde edilen arabirimler üzerinde yineleme yapmak mümkündür. veya 'nin genel veya genel olmayan biçimlerine IListICollectiondönüştürülen rank-1 dizileri söz konusu olduğunda, öğeleri dizine göre almak da mümkündür. genel veya genel olmayan formlarına IListdönüştürülen rank-1 dizileri söz konusu olduğunda, yukarıda açıklandığı gibi aynı çalışma zamanı dizisi kovaryans denetimlerine tabi olan öğeleri dizine göre ayarlamak da mümkündür. Diğer tüm arabirim yöntemlerinin davranışı VB dil belirtimi tarafından tanımlanmamıştır; bu, temel alınan çalışma zamanına kadardır.

Değer Türü Dönüştürmeleri

Değer türü değeri, temel başvuru türlerinden birine veya boxing adlı bir işlem aracılığıyla uyguladığı arabirim türüne dönüştürülebilir. Değer türü değeri kutulandığında, değer .NET Framework yığınında bulunduğu konumdan kopyalanır. Daha sonra yığındaki bu konuma başvuru döndürülür ve bir başvuru türü değişkeninde depolanabilir. Bu başvuru, değer türünün kutulu örneği olarak da adlandırılır. Kutulu örnek, değer türü yerine başvuru türüyle aynı semantiği içerir.

Kutulanmış değer türleri, kutulama kaldırma adlı bir işlem aracılığıyla özgün değer türlerine geri dönüştürülebilir. Kutulanmış değer türü kutulanmamışsa, değer yığından bir değişken konumuna kopyalanır. Bu noktadan sonra, bir değer türü gibi davranır. Bir değer türü kutusundan çıkarılırken değerin null değer veya değer türünün bir örneği olması gerekir. Aksi takdirde bir System.InvalidCastException özel durum oluşturulur. Değer numaralandırılmış bir türün örneğiyse, bu değer numaralandırılmış türün temel türüne veya aynı temel türe sahip başka bir numaralandırılmış türe de kutulanabilir. Null değer, değişmez değermiş Nothinggibi kabul edilir.

Boş değer atanabilir değer türlerini iyi desteklemek için, değer türü System.Nullable(Of T) özellikle kutulama ve kutulama kaldırma sırasında işlenir. Türdeki Nullable(Of T) bir değerin kutulanması, değerin özelliği True ise kutulanmış bir T tür HasValue değeriyle veya Nothing değerin HasValue özelliği ise değeriyle sonuçlanırFalse. türündeki TNullable(Of T) bir değerin kutulanması, özelliği kutulanmış değer olan Value ve HasValue özelliği olan bir örneğine Nullable(Of T) neden olurTrue. Değerin Nothing kutusu Nullable(Of T) herhangi biri T için kaldırılabilir ve özelliği olan HasValue bir değerle Falsesonuçlanabilir. Kutulanmış değer türleri başvuru türleri gibi davrandığından, aynı değere birden çok başvuru oluşturmak mümkündür. İlkel türler ve numaralandırılmış türler için, bu türlerin örnekleri sabit olduğundan bu durum ilgisizdir. Başka bir ifadeyle, bu türlerin kutulu örneğini değiştirmek mümkün değildir, bu nedenle aynı değere birden çok başvuru olduğunu gözlemlemek mümkün değildir.

Öte yandan, örnek değişkenleri erişilebilirse veya yöntemleri veya özellikleri örnek değişkenlerini değiştirirse yapılar değiştirilebilir olabilir. Yapıyı değiştirmek için kutulanmış bir yapıya başvuru kullanılırsa, kutulanmış yapıya yapılan tüm başvurular değişikliği görür. Bu sonuç beklenmeyen olabileceğinden, olarak Object yazılan bir değer bir konumdan başka bir kutulanmış değer türüne kopyalandığında, yalnızca başvurularının kopyalanması yerine yığında otomatik olarak kopyalanır. Örneğin:

Class Class1
    Public Value As Integer = 0
End Class

Structure Struct1
    Public Value As Integer
End Structure

Module Test
    Sub Main()
        Dim val1 As Object = New Struct1()
        Dim val2 As Object = val1

        val2.Value = 123

        Dim ref1 As Object = New Class1()
        Dim ref2 As Object = ref1

        ref2.Value = 123

        Console.WriteLine("Values: " & val1.Value & ", " & val2.Value)
        Console.WriteLine("Refs: " & ref1.Value & ", " & ref2.Value)
    End Sub
End Module

Programın çıktısı:

Values: 0, 123
Refs: 123, 123

Yerel değişkenin alanına atama, yerel değişkenin val2val1 alanını etkilemez çünkü kutulu Struct1 değer öğesine val2atandığında değerin bir kopyası yapılmıştır. Buna karşılık, atama ref2.Value = 123 hem hem de ref1ref2 başvuruda bulunan nesneyi etkiler.

Not. gibi yazılan System.ValueType kutulanmış yapılar için yapı kopyalama işlemi yapılmaz çünkü geç bağlama System.ValueTypeişlemi yapılamaz.

Kuralda, kutulanmış değer türlerinin atamada kopyalanacağı bir özel durum vardır. Kutulanmış değer türü başvurusu başka bir tür içinde depolanıyorsa, iç başvuru kopyalanmaz. Örneğin:

Structure Struct1
    Public Value As Object
End Structure

Module Test
    Sub Main()
        Dim val1 As Struct1
        Dim val2 As Struct1

        val1.Value = New Struct1()
        val1.Value.Value = 10

        val2 = val1
        val2.Value.Value = 123
        Console.WriteLine("Values: " & val1.Value.Value & ", " & _
            val2.Value.Value)
    End Sub
End Module

Programın çıktısı:

Values: 123, 123

Bunun nedeni, iç kutulanmış değerin, değer kopyalandığında kopyalanmamasıdır. Bu nedenle, hem val2.Value hem de val1.Value aynı kutulanmış değer türüne bir başvuruya sahiptir.

Not. İç kutulanmış değer türlerinin kopyalanmaması,.NET türü sisteminin bir sınırlamasıdır; türdeki bir değer kopyalandığında tüm iç kutulanmış değer türlerinin kopyalandığından Object emin olmak çok pahalı olacaktır.

Daha önce açıklandığı gibi, kutulanmış değer türleri yalnızca özgün türlerine göre kutulanmamış olabilir. Ancak kutulanmış ilkel türler, olarak Objectyazıldığında özel olarak kabul edilir. Dönüştürmeleri olan diğer herhangi bir ilkel türe dönüştürülebilirler. Örneğin:

Module Test
    Sub Main()
        Dim o As Object = 5
        Dim b As Byte = CByte(o)  ' Legal
        Console.WriteLine(b) ' Prints 5
    End Sub
End Module

Normalde, kutulanan Integer değer 5 bir Byte değişkende kutulanmamıştır. Ancak, ve Byte ilkel türler olduğundan Integer ve bir dönüştürmeye sahip olduğundan dönüştürmeye izin verilir.

Bir değer türünü arabirime dönüştürmenin, arabirimle kısıtlanmış genel bir bağımsız değişkenden farklı olduğunu unutmayın. Kısıtlanmış bir tür parametresinde arabirim üyelerine erişirken (veya üzerindeki çağrı yöntemlerinde Object), bir değer türü arabirime dönüştürüldüğünde ve arabirim üyesine erişildiğinde olduğu gibi kutulama gerçekleşmez. Örneğin, bir arabirimin ICounter bir değeri değiştirmek için kullanılabilecek bir yöntem Increment içerdiğini varsayalım. Kısıtlama olarak kullanılırsa ICounter , yönteminin Increment uygulanması kutulu bir kopya değil, üzerinde çağrılan değişkene Increment başvuruyla çağrılır:

Interface ICounter
    Sub Increment()
    ReadOnly Property Value() As Integer
End Interface

Structure Counter
    Implements ICounter

    Dim _value As Integer

    Property Value() As Integer Implements ICounter.Value
        Get
            Return _value
        End Get
    End Property

    Sub Increment() Implements ICounter.Increment
       value += 1
    End Sub
End Structure

Module Test
      Sub Test(Of T As ICounter)(x As T)
         Console.WriteLine(x.value)
         x.Increment()                     ' Modify x
         Console.WriteLine(x.value)
         CType(x, ICounter).Increment()    ' Modify boxed copy of x
         Console.WriteLine(x.value)
      End Sub

      Sub Main()
         Dim x As Counter
         Test(x)
      End Sub
End Module

için ilk çağrı Increment , değişkenindeki xdeğeri değiştirir. Bu, kutulanmış bir kopyasındaki değeri değiştiren ikinci çağrısına Incrementxeşdeğer değildir. Bu nedenle, programın çıkışı şöyledir:

0
1
1

Null Atanabilir Değer Türü Dönüştürmeleri

Bir değer türü T , T?türünün null atanabilir sürümüne ve sürümünden dönüştürebilir. dönüştürmesi T?T, dönüştürülen Nothingdeğer ise bir System.InvalidOperationException özel durum oluşturur. Ayrıca, T? için iç dönüştürme varsa T bir türe S dönüştürmesi Svardır. Bir değer türüyse S ve arasında T?S?aşağıdaki iç dönüştürmeler vardır:

  • Aynı sınıflandırmanın (daraltma veya genişletme) 'den'e T? dönüştürülmesi S?.

  • Aynı sınıflandırmanın (daraltma veya genişletme) 'den'e T dönüştürülmesi S?.

  • 'den'e S?Tdaraltma dönüştürmesi.

Örneğin, bir iç genişletme dönüştürmesi ile Integer?Long? arasında bir iç genişletme dönüştürmesi bulunduğundan IntegerLongöğesine var olur:

Dim i As Integer? = 10
Dim l As Long? = i

'den T? 'a S?dönüştürürken değeri T? ise Nothingdeğeri S? olur Nothing. veya değerine dönüştürülürken S?TST? veya S? değeri T? ise Nothingbir System.InvalidCastException özel durum oluşturulur.

Temel alınan türün System.Nullable(Of T)davranışı nedeniyle, null atanabilir bir değer türü T? kutulandığında, sonuç türündeki Tkutulanmış değer değil, türünde bir kutulanmış değerdir T?. Buna karşılık, null atanabilir bir değer türüne T?gelen kutusu kaldırıldığında, değer tarafından System.Nullable(Of T)sarmalanır ve Nothing türünde T?bir null değere kutulanmamış olur. Örneğin:

Dim i1? As Integer = Nothing
Dim o1 As Object = i1

Console.WriteLine(o1 Is Nothing)                    ' Will print True
o1 = 10
i1 = CType(o1, Integer?)
Console.WriteLine(i1)                               ' Will print 10

Bu davranışın bir yan etkisi, bir değer türünün T? arabirime dönüştürülmesi için türün kutulanması gerektiğinden T, tüm arabirimlerini uygulamak için null atanabilir bir değer türünün görünmesidir. Sonuç olarak, T? dönüştürülebilir olan tüm arabirimlere T dönüştürülebilir. Ancak, null atanabilir bir değer türünün T? genel kısıtlama denetimi veya yansıma amacıyla arabirimlerini T gerçekten uygulamadığını unutmayın. Örneğin:

Interface I1
End Interface

Structure T1
    Implements I1
    ...
End Structure

Module Test
    Sub M1(Of T As I1)(ByVal x As T)
    End Sub

    Sub Main()
        Dim x? As T1 = Nothing
        Dim y As I1 = x                ' Valid
        M1(x)                          ' Error: x? does not satisfy I1 constraint
    End Sub
End Module

Dize Dönüştürmeleri

İlk karakteri karakter değeri olan bir dizeye dönüştürülerek CharString sonuç elde edilir. değeri dizenin ilk karakteri olan bir karaktere dönüştürülerek StringChar sonuçlanır. dizisinin Char dönüştürülmesi String , karakterleri dizinin öğeleri olan bir dizeyle sonuçlanıyor. String Öğeleri dizenin Char karakterleri olan bir dizi karakterde sonuç dizisine dönüştürülüyor.

ve , , , SByte, UShort, Short, UInteger, , , IntegerULong, DoubleLongDateDecimalSingleve tam tersi arasındaki String tam dönüştürmeler bu belirtim kapsamının dışındadır ve tek bir ayrıntı dışında uygulamaya bağımlıdır. ByteBoolean Dize dönüştürmeleri her zaman çalışma zamanı ortamının geçerli kültürünü dikkate alır. Bu nedenle, çalışma zamanında gerçekleştirilmelidir.

Genişletme Dönüştürmeleri

Genişletme dönüştürmeleri hiçbir zaman taşmayabilir ancak duyarlık kaybına neden olabilir. Aşağıdaki dönüştürmeler genişletme dönüştürmeleridir:

Kimlik/Varsayılan dönüştürmeler

  • Bir türden kendisine.

  • Lambda yöntemi yeniden sınıflandırması için oluşturulan anonim temsilci türünden, aynı imzaya sahip herhangi bir temsilci türüne.

  • Değişmez değerden Nothing türe.

Sayısal dönüştürmeler

  • Uygulamasından Byte , UShort, Short, UInteger, , Integer, ULong, Long, Decimalveya Singleöğesine.Double

  • SByte'den Short, Integer, Long, Decimal, Singleveya Double.

  • UShort UInteger, Integer, ULong, Long, Decimal, Singleveya Double.

  • Kaynaktan ShortInteger, Long, DecimalSingle veya Double.

  • UInteger'dan ULong'e, Long'ye, Decimal'e, Single'e veya Double'e.

  • Kimden Integer yerine Long, Decimalveya SingleDouble.

  • ULong'den Decimal, Singleveya Double.

  • Kimden Long yerine Decimal, Single veya Double.

  • Decimal ile Single veya Double.

  • Single'dan Double'e

  • Sabit değerden 0 numaralandırılmış türe. (Not. 'den 0 herhangi bir numaralandırılmış türe dönüştürme, test bayraklarını basitleştirmek için genişletiliyor. Örneğin, değeri Oneolan numaralandırılmış bir türseValues, türündeki Values bir değişkeni v .) diyerek (v And Values.One) = 0test edebilirsiniz.

  • Numaralandırılmış bir türden temel alınan sayısal türüne veya temel alınan sayısal türünün genişletme dönüştürmesine sahip olduğu sayısal bir türe.

  • Sabit ifadenin değeri hedef türün aralığında olması koşuluyla, , , veya türündeki ULongUShortIntegerUIntegerShortLongsabit ifadeden daha dar bir türe.SByteByte (Not. veya Integer 'den UInteger , ULong ya da öğesine veya SingleDoubleLong öğesine dönüştürmeler DecimalSingleDouble duyarlık kaybına neden olabilir, ancak hiçbir zaman büyüklük kaybına neden olmaz.Single Diğer genişleyici sayısal dönüştürmeler hiçbir zaman bilgi kaybetmez.)

Başvuru dönüştürmeleri

  • Bir başvuru türünden temel türe.

  • Türün arabirimi veya değişken uyumlu bir arabirimi uygulaması koşuluyla, bir başvuru türünden arabirim türüne.

  • Arabirim türünden öğesine.Object

  • Arabirim türünden değişken uyumlu arabirim türüne.

  • Temsilci türünden değişken uyumlu temsilci türüne. (Not. Diğer birçok başvuru dönüştürmesi bu kurallar tarafından örtülür. Örneğin, anonim temsilciler öğesinden System.MulticastDelegatedevralan başvuru türleridir; dizi türleri öğesinden devralan başvuru türleridir; anonim türler öğesinden System.ArraySystem.Objectdevralan başvuru türleridir.)

Anonim Temsilci dönüştürmeleri

  • Lambda yöntemi yeniden sınıflandırması için oluşturulan anonim temsilci türünden daha geniş bir temsilci türüne.

Dizi dönüştürmeleri

  • Öğe türüne sahip bir dizi türünden SeS öğe türüne sahip bir dizi türüneTeT, aşağıdakilerin tümü doğruysa:

    • S ve T yalnızca öğe türünde farklılık gösterir.

    • Hem hem Te de Se başvuru türleridir veya başvuru türü olarak bilinen tür parametreleridir.

    • ile arasında bir genişletme başvurusu, dizi veya tür parametresi dönüştürmesi vardır SeTe.

  • Numaralandırılmış öğe türüne sahip bir dizi türünden SSe öğe türüne sahip bir dizi türüne TTeaşağıdakilerin tümü doğruysa:

    • S ve T yalnızca öğe türünde farklılık gösterir.

    • Te , temel alınan türüdür Se.

  • Numaralandırılmış öğe türüne sahip 1. derecedeki dizi türünden SSe, System.Collections.Generic.IList(Of Te)IReadOnlyList(Of Te), ICollection(Of Te), IReadOnlyCollection(Of Te)ve IEnumerable(Of Te)öğesine aşağıdakilerden biri doğru olduğunda:

    • Hem hem Te de Se başvuru türleridir veya başvuru türü olarak bilinen tür parametreleridir ve ile arasında bir genişletme başvurusu, dizi veya tür parametresi dönüştürmesi vardır SeTe: veya

    • Te , veya 'nin Setemel alınan türüdür.

    • Te ile aynıdır Se

Değer Türü dönüştürmeleri

  • Bir değer türünden temel türe.

  • Bir değer türünden türün uyguladığı arabirim türüne.

Null Atanabilir Değer Türü dönüştürmeleri

  • Türünden türüne TT?.

  • türünden T? türüne S?genişletme dönüştürmesi olan türünden T türüne S.

  • türünden T türüne S?genişletme dönüştürmesi olan türünden T türüne S.

  • Bir türden T? , türün uyguladığı arabirim türüne T .

Dize dönüştürmeleri

  • Char'dan String'e

  • Char()'dan String'e

Tür Parametresi dönüştürmeleri

  • Bir tür parametresinden öğesine.Object

  • Tür parametresinden arabirim türü kısıtlamasına veya arabirim türü kısıtlamasıyla uyumlu herhangi bir arabirim varyantına.

  • Tür parametresinden sınıf kısıtlaması tarafından uygulanan bir arabirime.

  • Tür parametresinden bir sınıf kısıtlaması tarafından uygulanan arabirimle uyumlu bir arabirim değişkenine.

  • Tür parametresinden sınıf kısıtlamasına veya sınıf kısıtlamasının temel türüne.

  • Tür parametresinden T tür parametresi kısıtlamasına Txveya herhangi bir şeyin Tx genişletme dönüştürmesi vardır.

Dönüştürmeleri Daraltma

Daraltma dönüştürmeleri, her zaman başarılı olduğu kanıtlanamayan dönüştürmeler, muhtemelen bilgi kaybettiği bilinen dönüştürmeler ve tür etki alanları arasında yapılan dönüştürmeler, daralma gösteriminden yeterince farklıdır. Aşağıdaki dönüştürmeler daraltma dönüştürmeleri olarak sınıflandırılır:

Boole dönüştürmeleri

  • Kaynak: BooleanByte , SByte, UShort, Short, UInteger, Integer, , ULong, Long, Decimal, Singleveya Double.

  • Byte, , SByte, UShort, , Short, UInteger, Integer, ULong, Long, Decimal, Singleveya Double ile .Boolean

Sayısal dönüştürmeler

  • Byte'dan SByte'e

  • SByte'dan Byte, UShort, UIntegerveya ULong.

  • UShort'den Byte, SByteveya Short.

  • Short'dan Byte'e, SByte'ye, UShort'e, UInteger'e veya ULong'e.

  • UInteger'dan Byte'e, SByte'ye, UShort'e, Short'e veya Integer'e.

  • Integer'den Byte, SByte, UShort, Short, UIntegerveya ULong.

  • ULong Byte, SByte, UShort, Short, UInteger, Integerveya Long.

  • Long Byte, SByte, UShort, Short, UInteger, Integerveya ULong.

  • Decimal'den Byte, SByte, UShort, Short, UInteger, Integer, ULongveya Long.

  • Uygulamasından Single , Byte, SByte, UShort, , Short, UInteger, Integer, ULongveya Longöğesine.Decimal

  • Kaynak: DoubleByte, SByte, UShort, Short, UInteger, Integer, , ULong, Long, Decimalveya Single.

  • Sayısal bir türden numaralandırılmış türe.

  • Numaralandırılmış bir türden, temel alınan sayısal türüne daraltma dönüştürmesi vardır.

  • Numaralandırılmış bir türden başka bir numaralandırılmış türe.

Başvuru dönüştürmeleri

  • Başvuru türünden daha türetilmiş bir türe.

  • Sınıf türü, arabirim türünü veya onunla uyumlu bir arabirim türü değişkenini uygulamazsa, bir sınıf türünden arabirim türüne.

  • Arabirim türünden sınıf türüne.

  • İki tür arasında devralma ilişkisi olmaması ve değişken uyumlu olmaması koşuluyla, arabirim türünden başka bir arabirim türüne.

Anonim Temsilci dönüştürmeleri

  • Lambda yöntemi yeniden sınıflandırması için oluşturulan anonim temsilci türünden daha dar bir temsilci türüne.

Dizi dönüştürmeleri

  • Öğe türüne sahip bir dizi türündenS, aşağıdakilerin tümünün doğru olması koşuluyla, öğe türüne sahip bir dizi türüne TTe:Se

    • S ve T yalnızca öğe türünde farklılık gösterir.
    • Hem hem Te de Se başvuru türleridir veya değer türleri olarak bilinmeyen tür parametreleridir.
    • ile arasında bir daraltma başvurusu, dizi veya tür parametresi dönüştürmesi vardır SeTe.
  • Öğe türüne sahip bir dizi türünden SeS numaralandırılmış öğe türüne sahip bir dizi türüne TTe, aşağıdakilerin tümü doğruysa:

    • S ve T yalnızca öğe türünde farklılık gösterir.
    • Se , öğesinin Te temel alınan türüdür veya her ikisi de aynı temel türü paylaşan farklı numaralandırılmış türlerdir.
  • Numaralandırılmış öğe türüne sahip 1. derece dizi türünden SSe, IList(Of Te)IReadOnlyList(Of Te), ICollection(Of Te)IReadOnlyCollection(Of Te) ve IEnumerable(Of Te)öğesine aşağıdakilerden biri doğru olduğunda:

    • Hem hem Te de Se başvuru türleridir veya başvuru türü olarak bilinen tür parametreleridir ve ile arasında bir daraltma başvurusu, dizi veya tür parametresi dönüştürmesi vardır SeTe; veya
    • Se , öğesinin Tetemel alınan türüdür veya her ikisi de aynı temel türü paylaşan farklı numaralandırılmış türlerdir.

Değer türü dönüştürmeleri

  • Başvuru türünden daha türetilmiş bir değer türüne.

  • Bir arabirim türünden değer türüne, değer türünün arabirim türünü uygulaması koşuluyla.

Null Atanabilir Değer Türü dönüştürmeleri

  • Türünden türüne T?T.

  • türünden T? türüne S?daraltma dönüştürmesi olan türünden T türüne S.

  • türünden T türüne S?daraltma dönüştürmesi olan türünden T türüne S.

  • türünden S? türüne Tdönüştürmenin olduğu bir türe ST.

Dize dönüştürmeleri

  • String'dan Char'e

  • String'dan Char()'e

  • Kaynaktan String ve Boolean öğesineBoolean.String

  • ve Byte, , SByte, UShort, , Short, , UIntegerInteger, , ULong, Long, DecimalSingleveya Doublearasında String dönüştürmeler.

  • Kaynaktan String ve Date öğesineDate.String

Tür Parametresi dönüştürmeleri

  • Kimden'den Object tür parametresine.

  • Tür parametresinden arabirim türüne, tür parametresinin bu arabirimle kısıtlanmaması veya bu arabirimi uygulayan bir sınıfla sınırlandırılmaması koşuluyla.

  • Arabirim türünden tür parametresine.

  • Tür parametresinden sınıf kısıtlamasının türetilmiş türüne.

  • Tür parametresinden tür parametresi T kısıtlamasının Tx daraltma dönüştürmesine sahip olduğu her şeye.

Tür Parametresi Dönüştürmeleri

Tür parametrelerinin dönüştürmeleri, varsa bu kısıtlamalara göre belirlenir. Tür parametresi T her zaman kendisine, öğesine ve türüne Objectve herhangi bir arabirim türünden ve türüne dönüştürülebilir. Türün T çalışma zamanında bir değer türü olması durumunda, 'den T veya arabirim türüne Object dönüştürmenin bir kutulama dönüştürmesi, dönüştürmenin ise veya arabirim türünden T dönüştürülmesinin Object bir kutulama dönüştürmesi olacağını unutmayın. Sınıf kısıtlaması C olan tür parametresi, tür parametresinden C ve temel sınıflarına ek dönüştürmeler tanımlar ve tam tersi de geçerlidir. Tür parametresi kısıtlamasına Tx sahip bir tür parametresiT, dönüştürmeyi Tx tanımlar ve her şey Tx dönüştürülür.

Öğe türü arabirim kısıtlaması I olan bir tür parametresi olan dizi, tür parametresinin de bir veya sınıf kısıtlaması olması koşuluyla öğe türü Iolan bir diziyle aynı kovaryant dizi dönüştürmelerine sahiptir Class (çünkü yalnızca başvuru dizisi öğesi türleri birlikte değişken olabilir). Öğe türü sınıf kısıtlaması C olan bir tür parametresi olan bir dizi, öğe türü Colan bir dizi ile aynı kovaryant dizi dönüştürmelerine sahiptir.

Yukarıdaki dönüştürme kuralları, kısıtlanmamış tür parametrelerinden arabirim dışı türlere dönüştürmelere izin vermez ve bu şaşırtıcı olabilir. Bunun nedeni, bu tür dönüştürmelerin semantiğiyle ilgili karışıklığı önlemektir. Örneğin, aşağıdaki bildirimi göz önünde bulundurun:

Class X(Of T)
    Public Shared Function F(t As T) As Long 
        Return CLng(t)    ' Error, explicit conversion not permitted
    End Function
End Class

dönüştürmesine TInteger izin verilseydi, bunun döndürülmesini X(Of Integer).F(7)7Lkolayca beklenebilirdi. Ancak, sayısal dönüştürmeler yalnızca derleme zamanında türlerin sayısal olduğu bilindiğinde dikkate alındığından, bu kabul edilmez. Semantiği net hale getirmek için yukarıdaki örneğin yazılması gerekir:

Class X(Of T)
    Public Shared Function F(t As T) As Long
        Return CLng(CObj(t))    ' OK, conversions permitted
    End Function
End Class

User-Defined Dönüştürmeleri

İç dönüştürmeler , dil tarafından tanımlanan dönüştürmelerdir (örneğin, bu belirtimde listelenmiştir), kullanıcı tanımlı dönüştürmeler ise işleci aşırı yüklenerek CType tanımlanır. Türler arasında dönüştürme yapılırken, iç dönüştürme uygulanamazsa kullanıcı tanımlı dönüştürmeler dikkate alınır. Kaynak ve hedef türleri için en özel kullanıcı tanımlı dönüştürme varsa, kullanıcı tanımlı dönüştürme kullanılır. Aksi takdirde derleme zamanı hatası oluşur. En özel dönüştürme, işleneni kaynak türe "en yakın" olan ve sonuç türü hedef türe "en yakın" olan dönüştürmedir. Hangi kullanıcı tanımlı dönüştürmenin kullanılacağını belirlerken, en özel genişletme dönüştürmesi kullanılır; genişletme dönüştürmesi en belirgin değilse, en özel daraltma dönüştürmesi kullanılır. En belirgin daraltma dönüştürmesi yoksa, dönüştürme tanımsız olur ve derleme zamanı hatası oluşur.

Aşağıdaki bölümlerde en belirli dönüştürmelerin nasıl belirlendiği ele alınıyor. Aşağıdaki terimleri kullanır:

Bir türden türüne ABiç genişletme dönüştürmesi varsa ve arabirim değilse A veya B değilse, A tarafından BkapsananveAB kapsar.

Bir tür kümesindeki en çok kapsayan tür, kümedeki diğer tüm türleri kapsayan türdür. Diğer tüm türleri kapsayan tek bir tür yoksa, kümenin en çok kapsayan türü yoktur. Sezgisel olarak, en çok kapsayan tür kümedeki "en büyük" türdür; diğer türlerin her birinin genişletme dönüştürmesi yoluyla dönüştürülebileceği türdür.

Bir tür kümesindeki en çok kapsadığı tür, kümedeki diğer tüm türler tarafından kapsadığı tek türdür. Diğer tüm türler tarafından tek bir tür kapsanmazsa, kümenin en çok kapsanan türü yoktur. Sezgisel olarak, en kapsamlı tür kümedeki "en küçük" türdür; bir daraltma dönüştürmesi aracılığıyla diğer türlerin her birine dönüştürülebilen türdür.

Bir tür T?için kullanıcı tanımlı aday dönüştürmeleri toplanırken, bunun yerine tarafından T tanımlanan kullanıcı tanımlı dönüştürme işleçleri kullanılır. Dönüştürülen tür de null atanabilir bir değer türüyse, yalnızca null değer türleri içermeyen kullanıcı tanımlı dönüştürme işleçlerinden herhangi biri Tkaldırılır. 'den dönüştürme işleci' den TT?S?S dönüştürme olarak kaldırılır ve gerekirse öğesine dönüştürülerekTT?, sonra kullanıcı tanımlı dönüştürme işlecinden ST öğesine ve gerekirse öğesine dönüştürülerek SS?değerlendirilir. Ancak dönüştürülen değer iseNothing, kaldırılan dönüştürme işleci doğrudan olarak S?yazılan bir değere Nothing dönüştürülür. Örneğin:

Structure S
    ...
End Structure

Structure T
    Public Shared Widening Operator CType(ByVal v As T) As S
        ...
    End Operator
End Structure

Module Test
    Sub Main()
        Dim x As T?
        Dim y As S?

        y = x                ' Legal: y is still null
        x = New T()
        y = x                ' Legal: Converts from T to S
    End Sub
End Module

Dönüştürmeler çözümlenirken, kullanıcı tanımlı dönüştürme işleçleri her zaman yükseltilmiş dönüştürme işleçlerine göre tercih edilir. Örneğin:

Structure S
    ...
End Structure

Structure T
    Public Shared Widening Operator CType(ByVal v As T) As S
        ...
    End Operator

    Public Shared Widening Operator CType(ByVal v As T?) As S?
        ...
    End Operator
End Structure

Module Test
    Sub Main()
        Dim x As T?
        Dim y As S?

        y = x                ' Calls user-defined conversion, not lifted conversion
    End Sub
End Module

Çalışma zamanında kullanıcı tanımlı dönüştürmenin değerlendirilmesi üç adıma kadar sürebilir:

  1. İlk olarak, gerekirse değer, iç dönüştürme kullanılarak kaynak türünden işlenen türüne dönüştürülür.

  2. Ardından kullanıcı tanımlı dönüştürme çağrılır.

  3. Son olarak, kullanıcı tanımlı dönüştürmenin sonucu, gerekirse iç dönüştürme kullanılarak hedef türe dönüştürülür.

Kullanıcı tanımlı dönüştürme değerlendirmesinin hiçbir zaman birden fazla kullanıcı tanımlı dönüştürme işleci içermeyeceğini unutmayın.

En Özel Genişletme Dönüştürmesi

İki tür arasındaki en belirli kullanıcı tanımlı genişletme dönüştürme işlecinin belirlenmesi aşağıdaki adımlar kullanılarak gerçekleştirilir:

  1. İlk olarak, tüm aday dönüştürme işleçleri toplanır. Aday dönüştürme işleçleri, kaynak türdeki kullanıcı tanımlı genişletme dönüştürme işleçlerinin ve hedef türdeki kullanıcı tanımlı genişletme dönüştürme işleçlerinin tümüdir.

  2. Ardından, uygulanamayan tüm dönüştürme işleçleri kümeden kaldırılır. Kaynak türünden işlenen türüne bir iç genişletme dönüştürme işleci varsa ve işlecin sonucundan hedef türüne bir iç genişletme dönüştürme işleci varsa, dönüştürme işleci bir kaynak türüne ve hedef türüne uygulanabilir. Geçerli dönüştürme işleçleri yoksa, en belirgin genişletme dönüştürmesi yoktur.

  3. Ardından, geçerli dönüştürme işleçlerinin en özel kaynak türü belirlenir:

    • Dönüştürme işleçlerinden herhangi biri doğrudan kaynak türünden dönüştürürse, kaynak türü en özel kaynak türüdür.

    • Aksi takdirde, en özel kaynak türü, dönüştürme işleçlerinin birleştirilmiş kaynak türleri kümesindeki en kapsayan türdür. En fazla kapsanan tür bulunamıyorsa, en belirgin genişletme dönüştürmesi yoktur.

  4. Ardından, geçerli dönüştürme işleçlerinin en belirli hedef türü belirlenir:

    • Dönüştürme işleçlerinden herhangi biri doğrudan hedef türe dönüşürse, hedef türü en özel hedef türüdür.

    • Aksi takdirde, en özel hedef türü, dönüştürme işleçlerinin birleştirilmiş hedef türleri kümesindeki en kapsayan türdür. En fazla kapsayan tür bulunamıyorsa, en belirgin genişletme dönüştürmesi yoktur.

  5. Ardından, tam olarak bir dönüştürme işleci en belirli kaynak türünden en belirli hedef türüne dönüştürürse, bu en özel dönüştürme işlecidir. Böyle birden fazla işleç varsa, en belirgin genişletme dönüştürmesi yoktur.

En Özel Daraltma Dönüştürme

İki tür arasındaki en belirli kullanıcı tanımlı daraltma dönüştürme işlecinin belirlenmesi aşağıdaki adımlar kullanılarak gerçekleştirilir:

  1. İlk olarak, tüm aday dönüştürme işleçleri toplanır. Aday dönüştürme işleçleri, kaynak türdeki kullanıcı tanımlı dönüştürme işleçlerinin tümü ve hedef türdeki kullanıcı tanımlı dönüştürme işleçlerinin tümü olur.

  2. Ardından, uygulanamayan tüm dönüştürme işleçleri kümeden kaldırılır. Kaynak türünden işlenen türüne bir iç dönüştürme işleci varsa ve işlecin sonucundan hedef türüne bir iç dönüştürme işleci varsa, dönüştürme işleci bir kaynak türüne ve hedef türüne uygulanabilir. Geçerli dönüştürme işleçleri yoksa, en belirgin daraltma dönüştürmesi yoktur.

  3. Ardından, geçerli dönüştürme işleçlerinin en özel kaynak türü belirlenir:

    • Dönüştürme işleçlerinden herhangi biri doğrudan kaynak türünden dönüştürürse, kaynak türü en özel kaynak türüdür.

    • Aksi takdirde, dönüştürme işleçlerinden herhangi biri kaynak türünü kapsayan türlerden dönüştürürse, en özel kaynak türü, bu dönüştürme işleçlerinin birleştirilmiş kaynak türleri kümesindeki en çok kapsanan türdür. En kapsamlı tür bulunamıyorsa, en belirgin daraltma dönüştürmesi yoktur.

    • Aksi takdirde, en özel kaynak türü, dönüştürme işleçlerinin birleştirilmiş kaynak türleri kümesindeki en kapsayan türdür. En kapsamlı tür bulunamıyorsa, en belirgin daraltma dönüştürmesi yoktur.

  4. Ardından, geçerli dönüştürme işleçlerinin en belirli hedef türü belirlenir:

    • Dönüştürme işleçlerinden herhangi biri doğrudan hedef türe dönüşürse, hedef türü en özel hedef türüdür.

    • Aksi takdirde, dönüştürme işleçlerinden herhangi biri hedef türü tarafından kapsanan türlere dönüştürülürse, en özel hedef türü bu dönüştürme işleçlerinin birleştirilmiş kaynak türleri kümesindeki en kapsayan türdür. En kapsamlı tür bulunamıyorsa, en belirgin daraltma dönüştürmesi yoktur.

    • Aksi takdirde, en özel hedef türü, dönüştürme işleçlerinin birleştirilmiş hedef türleri kümesindeki en kapsanan türdür. En kapsamlı tür bulunamıyorsa, en belirgin daraltma dönüştürmesi yoktur.

  5. Ardından, tam olarak bir dönüştürme işleci en belirli kaynak türünden en belirli hedef türüne dönüştürürse, bu en özel dönüştürme işlecidir. Böyle birden fazla işleç varsa, en belirgin daraltma dönüştürmesi yoktur.

Yerel Dönüştürmeler

Dönüştürmelerin bazıları yerel dönüştürmeler olarak sınıflandırılır çünkü bunlar .NET Framework tarafından yerel olarak desteklenir. Bu dönüştürmeler, ve TryCast dönüştürme işleçlerinin DirectCast yanı sıra diğer özel davranışlar aracılığıyla en iyi duruma getirilebilenlerdir. Yerel dönüştürmeler olarak sınıflandırılan dönüştürmeler şunlardır: kimlik dönüştürmeleri, varsayılan dönüştürmeler, başvuru dönüştürmeleri, dizi dönüştürmeleri, değer türü dönüştürmeleri ve tür parametresi dönüştürmeleri.

Baskın Tür

Bir tür kümesi verildiğinde, kümenin baskın türünü belirlemek için tür çıkarımı gibi durumlarda genellikle gereklidir. Bir tür kümesinin baskın türü, önce bir veya daha fazla türün örtük dönüştürmesi olmayan türleri kaldırarak belirlenir. Bu noktada hiç tür kalmadıysa, baskın bir tür yoktur. Baskın tür, kalan türlerin en fazla kapsayılan türüdür. En çok kapsanan birden fazla tür varsa, baskın bir tür yoktur.