확대 변환과 축소 변환(Visual Basic)Widening and Narrowing Conversions (Visual Basic)

형식 변환의 중요 한 고려 사항은 변환 결과가 대상 데이터 형식의 범위 내에 있는지 여부입니다.An important consideration with a type conversion is whether the result of the conversion is within the range of the destination data type.

확대 변환 에서는 원래 데이터의 가능한 값을 허용할 수 있는 데이터 형식으로 값을 변경 합니다.A widening conversion changes a value to a data type that can allow for any possible value of the original data. 확대 변환은 원본 값을 유지 하지만 표시를 변경할 수 있습니다.Widening conversions preserve the source value but can change its representation. 이는 정수 계열 형식 Decimal에서로 변환 하거나 String에서 Char 로 변환 하는 경우에 발생 합니다.This occurs if you convert from an integral type to Decimal, or from Char to String.

축소 변환 은 가능한 값의 일부를 저장하지 못할 수도 있는 데이터 형식으로 값을 변경합니다.A narrowing conversion changes a value to a data type that might not be able to hold some of the possible values. 예를 들어 정수 계열 형식으로 변환 될 때 소수 값이 반올림 되 고 변환 Boolean 되는 숫자 형식이 True 또는 False로 줄어듭니다.For example, a fractional value is rounded when it is converted to an integral type, and a numeric type being converted to Boolean is reduced to either True or False.

확대 변환Widening Conversions

다음 표에서는 표준 확대 변환을 보여 줍니다.The following table shows the standard widening conversions.

데이터 형식Data type 데이터 형식 확대 1Widens to data types 1
SByteSByte SByte, Short, Integer, Long, Decimal, Single, DoubleSByte, Short, Integer, Long, Decimal, Single, Double
ByteByte Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, DoubleByte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double
ShortShort Short, Integer, Long, Decimal, Single, DoubleShort, Integer, Long, Decimal, Single, Double
UShortUShort UShort, Integer, UInteger, Long, ULong, Decimal, Single, DoubleUShort, Integer, UInteger, Long, ULong, Decimal, Single, Double
IntegerInteger Integer, Long, Decimal, Single, Double2Integer, Long, Decimal, Single, Double2
UIntegerUInteger UInteger, Long, ULong, Decimal, Single, Double2UInteger, Long, ULong, Decimal, Single, Double2
LongLong Long, Decimal, Single, Double2Long, Decimal, Single, Double2
ULongULong ULong, Decimal, Single, Double2ULong, Decimal, Single, Double2
DecimalDecimal Decimal, Single, Double2Decimal, Single, Double2
SingleSingle Single, DoubleSingle, Double
DoubleDouble Double
모든 열거 형식 (열거형)Any enumerated type (Enum) 기본 정수 형식 및 기본 형식이 확대 되는 모든 형식입니다.Its underlying integral type and any type to which the underlying type widens.
CharChar Char, StringChar, String
Char 배열Char array Char배열과StringChar array, String
모든 형식Any type 개체Object
모든 파생 형식Any derived type 파생 되는 기본 형식 3입니다.Any base type from which it is derived 3.
모든 형식Any type 구현 하는 인터페이스입니다.Any interface it implements.
NothingNothing 모든 데이터 형식 또는 개체 유형입니다.Any data type or object type.

1 정의에 따라 모든 데이터 형식이 그 자체로 확대 됩니다.1 By definition, every data type widens to itself.

2 Integer, ,,Double 또는에서 또는 로Single 변환 하면 전체 자릿수가 손실 될 수 있지만 크기는 손실 되지 않습니다. Decimal Long UInteger ULong2 Conversions from Integer, UInteger, Long, ULong, or Decimal to Single or Double might result in loss of precision, but never in loss of magnitude. 이러한 의미에서는 정보 손실이 발생 하지 않습니다.In this sense they do not incur information loss.

3 파생 형식에서 해당 기본 형식 중 하나로 변환 하는 것은 확대 된 것 처럼 보일 수 있습니다.3 It might seem surprising that a conversion from a derived type to one of its base types is widening. 양쪽 맞춤은 파생 된 형식에 기본 형식의 모든 멤버가 포함 되어 있으므로 기본 형식의 인스턴스로 한정 된다는 것입니다.The justification is that the derived type contains all the members of the base type, so it qualifies as an instance of the base type. 반대 방향으로 기본 형식에는 파생 형식으로 정의 된 새 멤버가 포함 되지 않습니다.In the opposite direction, the base type does not contain any new members defined by the derived type.

확대 변환은 런타임에 항상 성공 하며 데이터 손실이 발생 하지 않습니다.Widening conversions always succeed at run time and never incur data loss. Option Strict 문이 유형 검사 On 를 또는로 Off설정 하는지 여부에 관계 없이 항상 암시적으로이를 수행할 수 있습니다.You can always perform them implicitly, whether the Option Strict Statement sets the type checking switch to On or to Off.

축소 변환Narrowing Conversions

표준 축소 변환에는 다음이 포함 됩니다.The standard narrowing conversions include the following:

  • 위의 표에서 확대 변환의 반대 방향 (모든 형식이 자체로 확대 됨을 제외 하 고)The reverse directions of the widening conversions in the preceding table (except that every type widens to itself)

  • 두 방향 모두에서 부울 과 임의의 숫자 형식으로 변환Conversions in either direction between Boolean and any numeric type

  • 모든 숫자 형식에서 열거형 형식으로 변환 (Enum)Conversions from any numeric type to any enumerated type (Enum)

  • 문자열과 숫자 형식, Boolean또는 날짜 사이에서 두 방향으로 변환Conversions in either direction between String and any numeric type, Boolean, or Date

  • 데이터 형식 또는 개체 형식에서 파생 된 형식으로 변환Conversions from a data type or object type to a type derived from it

축소 변환은 런타임에 항상 성공 하지 않으며 데이터 손실이 발생 하거나 실패할 수 있습니다.Narrowing conversions do not always succeed at run time, and can fail or incur data loss. 대상 데이터 형식이 변환 중인 값을 받을 수 없는 경우 오류가 발생 합니다.An error occurs if the destination data type cannot receive the value being converted. 예를 들어 숫자를 변환 하면 오버플로가 발생할 수 있습니다.For example, a numeric conversion can result in an overflow. Option Strict 문이 형식 확인 스위치를로 Off설정 하지 않으면 컴파일러에서 축소 변환을 암시적으로 수행할 수 없습니다.The compiler does not allow you to perform narrowing conversions implicitly unless the Option Strict Statement sets the type checking switch to Off.

참고

For Each…Next 컬렉션의 요소에서 루프 제어 변수로의 변환에 대 한 축소 변환 오류는 무시 됩니다.The narrowing-conversion error is suppressed for conversions from the elements in a For Each…Next collection to the loop control variable. 자세한 내용 및 예제는 각 항목에 대 한 "축소 변환" 섹션을 참조 하세요. 다음 문.For more information and examples, see the "Narrowing Conversions" section in For Each...Next Statement.

축소 변환을 사용 하는 경우When to Use Narrowing Conversions

원본 값이 오류 또는 데이터 손실 없이 대상 데이터 형식으로 변환 될 수 있다는 것을 알고 있는 경우 축소 변환을 사용 합니다.You use a narrowing conversion when you know the source value can be converted to the destination data type without error or data loss. 예를 들어 사용자에 게 " String True" 또는 "False"가 포함 된 경우 CBool 키워드를 사용 하 여로 Boolean변환할 수 있습니다.For example, if you have a String that you know contains either "True" or "False," you can use the CBool keyword to convert it to Boolean.

변환 하는 동안 발생 하는 예외Exceptions During Conversion

확대 변환은 항상 성공 하므로 예외를 throw 하지 않습니다.Because widening conversions always succeed, they do not throw exceptions. 축소 변환은 실패할 경우 가장 일반적으로 다음과 같은 예외를 throw 합니다.Narrowing conversions, when they fail, most commonly throw the following exceptions:

클래스 또는 구조체에서 해당 클래스 또는 구조체에 대 한 변환 연산자로 사용할 CType 함수 를 정의 하는 CType 경우 적절 한 하다 고 판단 예외를 throw 할 수 있습니다.If a class or structure defines a CType Function to serve as a conversion operator to or from that class or structure, that CType can throw any exception it deems appropriate. 또한 Visual Basic 함수나 .NET Framework CType 메서드를 호출 하 여 다양 한 예외를 throw 할 수 있습니다.In addition, that CType might call Visual Basic functions or .NET Framework methods, which in turn could throw a variety of exceptions.

참조 형식 변환 중 변경Changes During Reference Type Conversions

참조 형식 에서의 변환은 포인터만 값에 복사 합니다.A conversion from a reference type copies only the pointer to the value. 값 자체는 어떠한 방식으로든 복사 되거나 변경 되지 않습니다.The value itself is neither copied nor changed in any way. 변경할 수 있는 유일한 사항은 포인터를 포함 하는 변수의 데이터 형식입니다.The only thing that can change is the data type of the variable holding the pointer. 다음 예제에서는 데이터 형식이 파생 클래스에서 기본 클래스로 변환 되지만 이제 두 변수가 가리키는 개체가 변경 되지 않습니다.In the following example, the data type is converted from the derived class to its base class, but the object that both variables now point to is unchanged.

' 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  

참고자료See also