Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Ett viktigt övervägande med en typkonvertering är om resultatet av konverteringen ligger inom måldatatypens intervall.
En utvidgad konvertering ändrar ett värde till en datatyp som kan tillåta alla möjliga värden för de ursprungliga data. Vidgade konverteringar bevarar källvärdet men kan ändra dess representation. Detta inträffar om du konverterar från en integraltyp till Decimal, eller från Char till String.
En begränsad konvertering ändrar ett värde till en datatyp som kanske inte kan innehålla några av de möjliga värdena. Till exempel avrundas ett bråkvärde när det konverteras till en integraltyp och en numerisk typ som konverteras till Boolean reduceras till antingen True eller False.
Breddning av konverteringar
I följande tabell visas standardbreddningskonverteringar.
| Datatyp | Breddar till datatyper 1 |
|---|---|
| SByte |
SByte, Short, Integer, Long, Decimal, , , SingleDouble |
| byte |
Byte, Short, UShort, Integer, UInteger, Long, , ULong, Decimal, , SingleDouble |
| kort |
Short, Integer, Long, Decimal, , , SingleDouble |
| UShort |
UShort, Integer, UInteger, Long, ULong, , Decimal, , SingleDouble |
| Heltal |
Integer, Long, Decimal, Single, Double |
| UInteger |
UInteger, Long, ULong, Decimal, , Single, Double2 |
| Lång |
Long, Decimal, Single, Double2 |
| ULong |
ULong, Decimal, Single, Double2 |
| decimaler |
Decimal, Single, Double2 |
| singel |
Single, Double |
| Dubbel | Double |
| Alla uppräknade typer (uppräkning) | Dess underliggande integraltyp och alla typer som den underliggande typen breddas till. |
| Röding |
Char, String |
Char samling |
Char samling String |
| Alla typer | Objekt |
| Alla härledda typer | Vilken bastyp som helst från vilken den härleds 3. |
| Alla typer | Något gränssnitt det implementerar. |
| Ingenting | Alla datatyper eller objekttyper. |
1 Per definition breddas varje datatyp till sig själv.
2 Konverteringar från Integer, UInteger, Long, ULong eller Decimal till Single eller Double kan leda till förlust av precision, men aldrig förlust av storlek. I den meningen medför de inte informationsförlust.
3 Det kan verka förvånande att en konvertering från en härledd typ till en av dess bastyper utvidgas. Motiveringen är att den härledda typen innehåller alla medlemmar av bastypen, så den kvalificerar sig som en instans av bastypen. I motsatt riktning innehåller bastypen inga nya medlemmar som definierats av den härledda typen.
Vidgade konverteringar lyckas alltid vid körtid och medför aldrig dataförlust. Du kan alltid utföra dem implicit, oavsett om Option Strict-satsen anger typkontrollväxeln till On eller till Off.
Begränsa konverteringar
De standardiserade inskränkta konverteringarna omfattar följande:
Omvända riktningar för de vidgade konverteringarna i föregående tabell (förutom att varje typ vidgas till sig själv)
Konverteringar i båda riktningarna mellan boolesk och valfri numerisk typ
Konverteringar från valfri numerisk typ till valfri uppräkningstyp (
Enum)Konverteringar i endera riktningen mellan Sträng och valfri numerisk typ,
Boolean, eller DatumKonverteringar från en datatyp eller objekttyp till en typ som härleds från den
Begränsade konverteringar lyckas inte alltid vid körning och kan misslyckas eller medföra dataförlust. Ett fel uppstår om måldatatypen inte kan ta emot värdet som konverteras. En numerisk konvertering kan till exempel resultera i ett spill. Kompilatorn tillåter inte att du utför nedskalande konverteringar implicit om inte Option Strict-satsen anger typkontroll-alternativet till Off.
Anmärkning
Felet för smalnande konvertering ignoreras vid konverteringar från elementen i en For Each…Next samling till loopens kontrollvariabel. Mer information och exempel finns i avsnittet "Begränsa konverteringar" i För varje... Nästa instruktion.
När du ska använda smala konverteringar
Du använder en begränsad konvertering när du vet att källvärdet kan konverteras till måldatatypen utan fel eller dataförlust. Om du till exempel har en String som du vet innehåller antingen "True" eller "False" kan du använda nyckelordet CBool för att konvertera det till Boolean.
Undantag under konverteringen
Eftersom utvidgning av konverteringar alltid lyckas utlöser de inte undantag. Om konverteringarna minskar, när de misslyckas, utlöser de oftast följande undantag:
InvalidCastException — om ingen konvertering har definierats mellan de två typerna
OverflowException — (endast integraltyper) om det konverterade värdet är för stort för måltypen
Om en klass eller struktur definierar en CType-funktion som ska fungera som en konverteringsoperator till eller från den klassen eller strukturen, kan det utlösa alla undantag som CType den anser vara lämpliga. Dessutom kan det CType anropa Visual Basic-funktioner eller .NET Framework-metoder, vilket i sin tur kan utlösa en mängd olika undantag.
Ändringar under referenstypkonverteringar
En konvertering från en referenstyp kopierar bara pekaren till värdet. Själva värdet kopieras inte eller ändras på något sätt. Det enda som kan ändras är datatypen för variabeln som innehåller pekaren. I följande exempel konverteras datatypen från den härledda klassen till dess basklass, men objektet som båda variablerna nu pekar på är oförändrat.
' 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