Sdílet prostřednictvím


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, , SingleDouble
Bajt Byte, Short, , UShort, UIntegerInteger, LongULongDecimal, , SingleDouble
Krátké Short, Integer, Long, Decimal, , SingleDouble
UShort UShort, Integer, UInteger, , ULongLong, Decimal, , SingleDouble
Celé číslo Integer, Long, Decimal, SingleDouble2
Celé číslo UInteger UInteger, Long, ULong, Decimal, Single, Double2
Dlouhé Long, , DecimalSingle, Double2
ULong ULong, , DecimalSingle, Double2
Desetinné číslo Decimal, , SingleDouble2
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, ULongnebo do Single nebo DecimalDouble 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 Booleandatem

  • Př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  

Viz také