Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ávají zdrojovou hodnotu, ale mohou změnit její reprezentaci. K tomu dochází, pokud převedete z celočíselného typu na Decimal
, nebo z Char
do String
.
Zúžení při převodu změní hodnotu na datový typ, který nemusí být schopen pojmout některé z možných hodnot. Například desetinná hodnota se zaokrouhlí při převodu na celočíselný typ, a číselný typ, který se převádí na Boolean
, se zmenší na True
nebo False
.
Rozšiřující převody
Následující tabulka ukazuje standardní typy rozšiřujících převodů.
Datový typ | Rozšiřuje se na datové typy 1. |
---|---|
SByte |
SByte , Short , Integer , Long , Decimal , , Single Double |
bajt |
Byte , Short , , UShort , Integer UInteger , Long ULong Decimal , , Single Double |
short |
Short , Integer , Long , Decimal , , Single Double |
UShort |
UShort , Integer , UInteger , , Long ULong , Decimal , , Single Double |
celočíselné |
Integer , Long , Decimal , Single Double 2 |
Neznaménkový integer |
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 |
Jednoduchý |
Single , Double |
Dvojitý | 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. |
Postava |
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. |
Nic | 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 Decimal
do Single
nebo Double
mohou vést ke ztrátě přesnosti, ale nikdy ve ztrátu velikosti. V tomto smyslu nedochází ke ztrátě informací.
3 Může se zdát překvapivé, že rozšiřování 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
.
Zúžení konverze
Mezi standardní zužující převody patří:
Opačné směry rozšiřujících konverzí v předchozí tabulce (kromě případu, kdy se každý typ rozšiřuje sám na sebe)
Převody v obou směrech mezi booleovský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 sekci Zúžující převody 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