Rozšíření a zúžení převodů (Visual Basic)
Důležitým aspektem převodu typu je to, jestli je výsledek převodu v rozsahu cílového datového typu.
Rozšiřující převod změní hodnotu na datový typ, který může umožňovat jakoukoli možnou hodnotu původních dat. Rozšiřující převody zachová zdrojovou hodnotu, ale mohou změnit jeho reprezentaci. K tomu dochází, pokud převedete z celočíselného typu na Decimal
, nebo z Char
do String
.
Zužující převod změní hodnotu na datový typ, který nemusí mít některé možné hodnoty. Například desetinná hodnota se zaokrouhlí při převodu na celočíselný typ a číselný typ, na který se převede, se Boolean
zmenší na jeden True
nebo False
.
Rozšiřující převody
Následující tabulka ukazuje standardní rozšiřující převody.
Datový typ | Rozšiřuje se na datové typy 1. |
---|---|
Sbyte | SByte , Short , Integer , Long , Decimal , , Single Double |
Bajt | Byte , Short , , UShort , UInteger Integer , Long ULong Decimal , , Single Double |
Krátké | Short , Integer , Long , Decimal , , Single Double |
UShort | UShort , Integer , UInteger , , ULong Long , Decimal , , Single Double |
Celé číslo | Integer , Long , Decimal , Single Double 2 |
Celé číslo UInteger | UInteger , Long , ULong , Decimal , Single , Double 2 |
Dlouhé | Long , , Decimal Single , Double 2 |
ULong | ULong , , Decimal Single , Double 2 |
Desetinné číslo | Decimal , , Single Double 2 |
Jednoho | Single , Double |
Dvojité desetinné číslo | Double |
Libovolný výčtový typ (výčet) | Základní celočíselný typ a jakýkoli typ, na který se základní typ rozšiřuje. |
Char | Char , String |
Char Pole |
Char Pole String |
Libovolný typ | Objekt |
Libovolný odvozený typ | Jakýkoli základní typ, ze kterého je odvozen 3. |
Libovolný typ | Jakékoli rozhraní, které implementuje. |
Nothing | Libovolný datový typ nebo typ objektu. |
1 Podle definice se každý datový typ rozšiřuje na sebe.
2 Převody z Integer
, , UInteger
, Long
, ULong
nebo do Single
nebo Decimal
Double
mohou vést ke ztrátě přesnosti, ale nikdy ve ztrátě velikosti. V tomto smyslu neshromádí ztrátu informací.
3 Může se zdát divné, že se rozšiřující převod z odvozeného typu na jeden z jeho základních typů. Odůvodnění je, že odvozený typ obsahuje všechny členy základního typu, takže se kvalifikuje jako instance základního typu. V opačném směru základní typ neobsahuje žádné nové členy definované odvozeným typem.
Rozšíření převodů vždy proběhne úspěšně za běhu a nikdy nedojde ke ztrátě dat. Vždy je můžete provádět implicitně, ať už příkaz Option Strict nastaví přepínač kontroly typů na On
nebo na Off
.
Zužující převody
Mezi standardní zužující převody patří:
Obrácené směry rozšiřujících převodů v předchozí tabulce (s tím rozdílem, že každý typ se rozšiřuje na sebe)
Převody v obou směrech mezi logickým a libovolným číselným typem
Převody z libovolného číselného typu na jakýkoli výčtový typ (
Enum
)Převody v libovolném směru mezi řetězcem a libovolným číselným typem nebo
Boolean
datemPřevody z datového typu nebo typu objektu na typ odvozený z něj
Zúžení převodů není vždy úspěšné za běhu a může selhat nebo může dojít ke ztrátě dat. Pokud cílový datový typ nemůže přijmout převedenou hodnotu, dojde k chybě. Číselný převod může například vést k přetečení. Kompilátor neumožňuje provádět zužující převody implicitně, pokud příkaz Option Strict nenastaví přepínač kontroly typů na Off
.
Poznámka:
Chyba zužujícího převodu je potlačena pro převody z prvků v For Each…Next
kolekci na řídicí proměnnou smyčky. Další informace a příklady najdete v části Zúžení převodů v části Pro každý z nich... Next – příkaz.
Kdy použít zužující převody
Převod zužující se použije, pokud víte, že zdrojovou hodnotu lze převést na cílový datový typ bez chyby nebo ztráty dat. Pokud například víte String
, že obsahuje hodnotu Pravda nebo Nepravda, můžete ho pomocí klíčového CBool
slova převést na Boolean
.
Výjimky během převodu
Vzhledem k tomu, že rozšiřující převody jsou vždy úspěšné, nevyvolají výjimky. Zužující převody, pokud selžou, nejčastěji můžou vyvolat následující výjimky:
InvalidCastException — není-li mezi těmito dvěma typy definován žádný převod
OverflowException — (pouze celočíselné typy), pokud je převedená hodnota pro cílový typ příliš velká
Pokud třída nebo struktura definuje funkci CType, která slouží jako operátor převodu do nebo z této třídy nebo struktury, může CType
vyvolat jakoukoli výjimku, která považuje za vhodné. Kromě toho může CType
volat funkce jazyka Visual Basic nebo metody rozhraní .NET Framework, které by pak mohly vyvolat různé výjimky.
Změny během převodů typů odkazů
Převod z referenčního typu zkopíruje pouze ukazatel na hodnotu. Samotná hodnota se nijak nezkopíruje ani nemění. Jedinou věcí, kterou lze změnit, je datový typ proměnné, která drží ukazatel. V následujícím příkladu je datový typ převeden z odvozené třídy na její základní třídu, ale objekt, na který nyní obě proměnné odkazují, je beze změny.
' Assume class cSquare inherits from class cShape.
Dim shape As cShape
Dim square As cSquare = New cSquare
' The following statement performs a widening
' conversion from a derived class to its base class.
shape = square