Share via


Bredda och begränsa konverteringar (Visual Basic)

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, , Double2
UInteger UInteger, Long, ULong, Decimal, , Single, Double2
Lång Long, Decimal, Single, Double2
ULong ULong, Decimal, Single, Double2
Decimal Decimal, Single, Double2
Enda Single, Double
Dubbel Double
Alla uppräknade typer (uppräkning) Dess underliggande integraltyp och alla typer som den underliggande typen breddas till.
Char Char, String
Char Array Char Array String
Alla typer Objekt
Alla härledda typer Alla bastyper som den härleds från 3.
Alla typer Alla gränssnitt som implementeras.
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 eller Double kan leda till Single förlust av precision, men aldrig i förlust av omfattning. 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örning och medför aldrig dataförlust. Du kan alltid utföra dem implicit, oavsett om alternativet Strikt -instruktion anger typkontrollväxeln till On eller till Off.

Begränsa konverteringar

Standardkonverteringarna 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 Datum

  • Konverteringar 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 begränsade konverteringar implicit om inte alternativet Strikt-instruktion anger typkontrollväxeln till Off.

Kommentar

Felet narrowing-conversion ignoreras för konverteringar från elementen i en For Each…Next samling till loopkontrollvariabeln. 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 konvertering

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  

Se även