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.
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
SingleDecimalDoubledönüştürmeleriUIntegerenDoubleSingleyakın veya değere yuvarlanir.LongULongIntegerBu 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,DoubleDecimalveya 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,DoubleveyaDecimalise, 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, birSystem.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 ,
DoubleveyaDecimaliseSingledö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
DoubleSingleDoubledönüştürme için, değer enSingleyakın değere yuvarlanir.DoubleDeğer olarakSingletemsil etmek için çok küçükse, sonuç pozitif sıfır veya negatif sıfır olur.DoubleDeğer olarakSingletemsil edilemeyecek kadar büyükse, sonuç pozitif sonsuz veya negatif sonsuz olur.Doubledeğer iseNaN, sonuç daNaNolur.veya 'den
Singledönüştürme içinDecimal, kaynak değer gösterimeDecimaldönüştürülür ve gerekirse 28. ondalık basamaktan sonra en yakın sayıya yuvarlanir.DoubleKaynak değer olarakDecimaltemsil etmek için çok küçükse, sonuç sıfır olur. Kaynak değerNaN, sonsuz veya olarak temsilDecimaledilemeyecek kadar büyükse birSystem.OverflowExceptionözel durum oluşturulur.'den değerine
DoubleSingleDoubledönüştürme için, değer enSingleyakın değere yuvarlanir.DoubleDeğer olarakSingletemsil etmek için çok küçükse, sonuç pozitif sıfır veya negatif sıfır olur.DoubleDeğer olarakSingletemsil edilemeyecek kadar büyükse, sonuç pozitif sonsuz veya negatif sonsuz olur.Doubledeğer iseNaN, sonuç daNaNolur.
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:
SveTher ikisi de aynı genel türündenU(Of U1,...,Un)oluşturulur.Her tür parametresi
Uxiçin:Tür parametresi varyans
Sxolmadan bildirildiyse veTxaynı 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ürmesiSxTxolmalı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ürmesiTxSxolmalı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:
-
AveBhem başvuru türleri hem de değer türleri olarak bilinmeyen tür parametreleridir; veAgenişletme başvurusuna, diziye veya tür parametresine dönüştürmeyeBsahiptir; veya -
AveBher ikisi de aynı temel türün numaralandırılmış türleridir; veya - ve türlerinden
ABbiri 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ülmesiS?.Aynı sınıflandırmanın (daraltma veya genişletme) 'den'e
TdönüştürülmesiS?.'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
Nothingtüre.
Sayısal dönüştürmeler
Uygulamasından
Byte,UShort,Short,UInteger, ,Integer,ULong,Long,DecimalveyaSingleöğesine.DoubleSByte'denShort,Integer,Long,Decimal,SingleveyaDouble.UShortUInteger,Integer,ULong,Long,Decimal,SingleveyaDouble.Kaynaktan
ShortInteger,Long,DecimalSingleveyaDouble.UInteger'danULong'e,Long'ye,Decimal'e,Single'e veyaDouble'e.Kimden
IntegeryerineLong,DecimalveyaSingleDouble.ULong'denDecimal,SingleveyaDouble.Kimden
LongyerineDecimal,SingleveyaDouble.DecimalileSingleveyaDouble.Single'danDouble'eSabit değerden
0numaralandırılmış türe. (Not. 'den0herhangi bir numaralandırılmış türe dönüştürme, test bayraklarını basitleştirmek için genişletiliyor. Örneğin, değeriOneolan numaralandırılmış bir türseValues, türündekiValuesbir değişkeniv.) 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. veyaInteger'denUInteger,ULongya da öğesine veyaSingleDoubleLongöğesine dönüştürmelerDecimalSingleDoubleduyarlık kaybına neden olabilir, ancak hiçbir zaman büyüklük kaybına neden olmaz.SingleDiğ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.
ObjectArabirim 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 öğesindenSystem.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:SveTyalnızca öğe türünde farklılık gösterir.Hem hem
TedeSebaş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üneTTeaşağıdakilerin tümü doğruysa:SveTyalnızca öğe türünde farklılık gösterir.Te, temel alınan türüdürSe.
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)veIEnumerable(Of Te)öğesine aşağıdakilerden biri doğru olduğunda:Hem hem
TedeSebaş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ırSeTe: veyaTe, veya 'ninSetemel alınan türüdür.Teile aynıdırSe
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üneS?genişletme dönüştürmesi olan türündenTtürüneS.türünden
TtürüneS?genişletme dönüştürmesi olan türündenTtürüneS.Bir türden
T?, türün uyguladığı arabirim türüneT.
Dize dönüştürmeleri
Char'danString'eChar()'danString'e
Tür Parametresi dönüştürmeleri
Bir tür parametresinden öğesine.
ObjectTü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
Ttür parametresi kısıtlamasınaTxveya herhangi bir şeyinTxgeniş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,SingleveyaDouble.Byte, ,SByte,UShort, ,Short,UInteger,Integer,ULong,Long,Decimal,SingleveyaDoubleile .Boolean
Sayısal dönüştürmeler
Byte'danSByte'eSByte'danByte,UShort,UIntegerveyaULong.UShort'denByte,SByteveyaShort.Short'danByte'e,SByte'ye,UShort'e,UInteger'e veyaULong'e.UInteger'danByte'e,SByte'ye,UShort'e,Short'e veyaInteger'e.Integer'denByte,SByte,UShort,Short,UIntegerveyaULong.ULongByte,SByte,UShort,Short,UInteger,IntegerveyaLong.LongByte,SByte,UShort,Short,UInteger,IntegerveyaULong.Decimal'denByte,SByte,UShort,Short,UInteger,Integer,ULongveyaLong.Uygulamasından
Single,Byte,SByte,UShort, ,Short,UInteger,Integer,ULongveyaLongöğesine.DecimalKaynak:
DoubleByte,SByte,UShort,Short,UInteger,Integer, ,ULong,Long,DecimalveyaSingle.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ünden
S, aşağıdakilerin tümünün doğru olması koşuluyla, öğe türüne sahip bir dizi türüneTTe:Se-
SveTyalnızca öğe türünde farklılık gösterir. - Hem hem
TedeSebaş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
SeSnumaralandırılmış öğe türüne sahip bir dizi türüneTTe, aşağıdakilerin tümü doğruysa:-
SveTyalnızca öğe türünde farklılık gösterir. -
Se, öğesininTetemel 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)veIEnumerable(Of Te)öğesine aşağıdakilerden biri doğru olduğunda:- Hem hem
TedeSebaş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ırSeTe; veya -
Se, öğesininTetemel alınan türüdür veya her ikisi de aynı temel türü paylaşan farklı numaralandırılmış türlerdir.
- Hem hem
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üneS?daraltma dönüştürmesi olan türündenTtürüneS.türünden
TtürüneS?daraltma dönüştürmesi olan türündenTtürüneS.türünden
S?türüneTdönüştürmenin olduğu bir türeST.
Dize dönüştürmeleri
String'danChar'eString'danChar()'eKaynaktan
StringveBooleanöğesineBoolean.Stringve
Byte, ,SByte,UShort, ,Short, ,UIntegerInteger, ,ULong,Long,DecimalSingleveyaDoublearasındaStringdönüştürmeler.Kaynaktan
StringveDateöğesineDate.String
Tür Parametresi dönüştürmeleri
Kimden'den
Objecttü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
TkısıtlamasınınTxdaraltma 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:
İ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.
Ardından kullanıcı tanımlı dönüştürme çağrılır.
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:
İ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.
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.
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.
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.
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:
İ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.
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.
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.
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.
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.
Visual Basic language spec