Rozszerzanie i zwężanie konwersji (Visual Basic)
Ważną kwestią podczas konwersji typu jest to, czy wynik konwersji mieści się w zakresie docelowego typu danych.
Konwersja rozszerzająca zmienia wartość na typ danych, który może zezwalać na dowolną możliwą wartość oryginalnych danych. Rozszerzanie konwersji zachowuje wartość źródłową, ale może zmienić jej reprezentację. Dzieje się tak w przypadku konwersji z typu całkowitego na Decimal
, lub z Char
na String
.
Konwersja zawężająca zmienia wartość na typ danych, który może nie być w stanie przechowywać niektórych możliwych wartości. Na przykład wartość ułamkowa jest zaokrąglona, gdy jest konwertowana na typ całkowity, a typ Boolean
liczbowy konwertowany na jest zredukowany do True
wartości lub False
.
Poszerzenie konwersji
W poniższej tabeli przedstawiono standardowe konwersje rozszerzające.
Typ danych | Rozszerzanie do typów danych 1 |
---|---|
Sbyte | SByte , Short , Integer , Long , Decimal , Single , Double |
Bajtów | Byte , Short , UShort , Integer , UInteger , Long , ULong , Decimal , Single , Double |
Krótki | Short , Integer , Long , Decimal , Single , Double |
Ushort | UShort , Integer , UInteger , Long , ULong , Decimal , Single , Double |
Liczba całkowita | Integer , Long , , Single Decimal , Double 2 |
Uinteger | UInteger , Long ULong Decimal , , Single 2Double |
Długi | Long , Decimal , Single , Double 2 |
Ulong | ULong , Decimal , Single , Double 2 |
Dziesiętnych | Decimal , Single , Double 2 |
Pojedynczy | Single , Double |
Podwójne | Double |
Dowolny wyliczony typ (wyliczenie) | Jego podstawowy typ całkowity i dowolny typ, do którego rozszerza się podstawowy typ. |
Char | Char , String |
Char Tablicy |
Char Tablicy String |
Dowolny typ | Obiekt |
Dowolny typ pochodny | Dowolny typ podstawowy, z którego pochodzi 3. |
Dowolny typ | Dowolny interfejs implementuje. |
Nothing | Dowolny typ danych lub typ obiektu. |
1 Według definicji każdy typ danych rozszerza się do siebie.
2 Konwersje z Integer
, , UInteger
, Long
ULong
lub Decimal
do lub Double
mogą spowodować Single
utratę dokładności, ale nigdy nie traci wielkości. W tym sensie nie powodują utraty informacji.
3 Może wydawać się zaskakujące, że konwersja z typu pochodnego na jeden z jego typów bazowych jest rozszerzana. Uzasadnienie polega na tym, że typ pochodny zawiera wszystkie elementy członkowskie typu podstawowego, więc kwalifikuje się jako wystąpienie typu podstawowego. W przeciwnym kierunku typ podstawowy nie zawiera żadnych nowych elementów członkowskich zdefiniowanych przez typ pochodny.
Konwersje rozszerzające zawsze kończą się powodzeniem w czasie wykonywania i nigdy nie powodują utraty danych. Zawsze można je wykonać niejawnie, niezależnie od tego, czy instrukcja Option Strict ustawia przełącznik sprawdzania typów na On
lub na Off
.
Zawężanie konwersji
Standardowe konwersje zawężania obejmują następujące elementy:
Odwrotne kierunki konwersji rozszerzających w poprzedniej tabeli (z wyjątkiem tego, że każdy typ rozszerza się na siebie)
Konwersje w obu kierunkach między wartościami logicznymi i dowolnym typem liczbowym
Konwersje z dowolnego typu liczbowego na dowolny typ wyliczony (
Enum
)Konwersje w dowolnym kierunku między ciągiem a dowolnym typem liczbowym,
Boolean
lub datąKonwersje z typu danych lub typu obiektu na typ pochodny od niego
Konwersje zawężania nie zawsze kończą się powodzeniem w czasie wykonywania i mogą zakończyć się niepowodzeniem lub spowodować utratę danych. Błąd występuje, jeśli docelowy typ danych nie może otrzymać przekonwertowanej wartości. Na przykład konwersja liczbowa może spowodować przepełnienie. Kompilator nie zezwala na wykonywanie konwersji zawężania niejawnie, chyba że instrukcja Option Strict ustawia przełącznik sprawdzania typów na Off
.
Uwaga
Błąd konwersji zawężającej jest pomijany dla konwersji z elementów w For Each…Next
kolekcji do zmiennej sterującej pętli. Aby uzyskać więcej informacji i przykładów, zobacz sekcję "Zawężanie konwersji" w sekcji Dla każdego... Następna instrukcja.
Kiedy używać konwersji zawężania
Konwersja zawężania jest używana, gdy wiadomo, że wartość źródłowa może zostać przekonwertowana na docelowy typ danych bez błędu lub utraty danych. Jeśli na przykład wiesz String
, że zawiera wartość "Prawda" lub "Fałsz", możesz użyć słowa kluczowego CBool
, aby przekonwertować go na Boolean
.
Wyjątki podczas konwersji
Ponieważ konwersje rozszerzające zawsze kończą się powodzeniem, nie zgłaszają wyjątków. Zawężanie konwersji, gdy kończą się niepowodzeniem, najczęściej zgłaszają następujące wyjątki:
InvalidCastException — jeśli między dwoma typami nie zdefiniowano konwersji
OverflowException — (tylko typy całkowite), jeśli przekonwertowana wartość jest zbyt duża dla typu docelowego
Jeśli klasa lub struktura definiuje funkcję CType , która będzie służyć jako operator konwersji do lub z tej klasy lub struktury, może CType
zgłosić dowolny wyjątek, który uzna za odpowiedni. Ponadto może to CType
wywoływać funkcje Visual Basic lub metody .NET Framework, które z kolei mogą zgłaszać różne wyjątki.
Zmiany podczas konwersji typów odwołań
Konwersja z typu odwołania kopiuje tylko wskaźnik do wartości. Sama wartość nie jest kopiowana ani zmieniana w żaden sposób. Jedyną rzeczą, którą można zmienić, jest typ danych zmiennej trzymającej wskaźnik. W poniższym przykładzie typ danych jest konwertowany z klasy pochodnej na jej klasę bazową, ale obiekt, na który wskazują teraz obie zmienne, jest niezmieniony.
' 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