다음을 통해 공유


Visual Basic 2010의 주요 변경 사항

다음 표에서는 Visual Basic 2008에서 만든 응용 프로그램이 Visual Basic 2010에서 컴파일되지 않도록 하거나 런타임 동작을 변경할 수 있는 모든 변경 사항을 보여 줍니다.

범주

문제

설명

배열 형식 유추

배열 이니셜라이저의 유추 규칙이 변경되었습니다.

예를 들어, Dim x() = {1, 2, 3}은 Integer 형식으로 유추됩니다.

Dim x() = {1, 2.2, "3"}은 Option Strict가 On으로 설정된 경우 컴파일러 오류를 발생시킵니다.

Visual Basic 2008에서 배열 변수를 선언하지만 요소 형식을 생략하는 경우 컴파일러는 요소 형식이 Object라고 가정합니다. Visual Basic 2010에서는 배열 요소 형식의 유추를 도입하고 요소 형식을 배열 리터럴의 기준 형식으로 유추합니다.

기준 형식이 없는 경우 Object 형식이 가정됩니다. 이 경우 Option Strict가 On으로 설정되어 있으면 컴파일러 오류가 발생합니다.

자세한 내용은 Visual Basic의 배열을 참조하십시오.

이름 충돌

파일 수준에서 가져온 네임스페이스의 형식은 프로젝트 수준에서 가져온 네임스페이스의 형식보다 우선합니다.

두 네임스페이스에 각각 이름이 같은 형식이 포함되어 있는 경우 한 형식이 프로젝트 수준에서 가져온 네임스페이스에 있고 이름이 동일한 다른 형식이 파일 수준에서 가져온 네임스페이스에 있으면 Visual Basic 2010에서는 파일 수준에서 가져온 네임스페이스의 형식에 바인딩합니다. 이전 버전에서는 프로젝트 수준에서 가져온 네임스페이스의 형식에 바인딩합니다. 자세한 내용은 Imports 문(.NET 네임스페이스 및 형식)을 참조하십시오.

식별자인 쿼리 키워드

쿼리 키워드를 식별자로 사용하면 예기치 않은 결과가 생성될 수 있습니다.

Visual Basic 컴파일러는 다양한 컨텍스트에서 키워드를 식별자 이름으로 받아들입니다. Visual Basic 2010에서 추가된 암시적 줄 연속에 대한 새 규칙 때문에 줄 연속 문자를 생략하는 LINQ 쿼리에서 키워드를 요소 이름으로 사용하는 경우 오류가 발생할 수 있습니다.

예를 들어, 다음 예제에서는 Aggregate 키워드를 식별자 이름으로 사용합니다. aggregate 식별자가 쿼리 바로 뒤에 있는 경우 쿼리 절의 암시적 줄 연속 규칙 때문에 해당 쿼리의 일부로 간주됩니다. 이 예제에서는 이 때문에 컴파일러 오류가 발생합니다.

Dim aggregate = 0
Dim numbers = {1, 2, 3, 4, 5}
Dim query As IEnumerable(Of Integer)

While aggregate < 5

    query = From i In numbers
            Skip aggregate
            Take 1
            Select i
    aggregate += 1

End While

줄이 이전 코드 줄에 암시적으로 포함되지 않도록 하려면 다음 예제와 같이 코드 줄 앞에 추가 줄 바꿈을 추가합니다.

    query = From i In numbers
            Skip aggregate
            Take 1
            Select i

    aggregate += 1

암시적 줄 연속에 대한 자세한 내용은 Visual Basic의 문을 참조하십시오.

모듈

모듈은 MustInherit로 컴파일됩니다.

모듈은 이제 MustInherit로 컴파일됩니다. 이는 모듈의 동작 방식에 영향을 미치지 않지만 리플렉션을 사용하여 Visual Basic Module 문을 통해 만든 형식을 검사하는 코드에 영향을 미칠 수 있습니다. 자세한 내용은 Module 문을 참조하십시오.

람다 식

익명 람다 식은 고유 형식을 생성합니다.

람다 식에 대해 생성된 익명 대리자 형식은 이제 반드시 고유합니다. 이는 다음 예제의 코드와 같이 익명 대리자의 형식이 같은지 확인하는 코드에 영향을 미칠 수 있습니다.

Dim x = Function(a As Integer) a + 1
Dim y = Function(b As Integer) b + 1

' Returns True in Visual Basic 2008. Returns False in Visual Basic 2010.
Dim t = x.GetType().Equals(y.GetType())

자세한 내용은 람다 식(Visual Basic)을 참조하십시오.

제네릭 인터페이스의 가변성

제네릭 인터페이스에서 모호성이 생길 수도 있습니다.

Visual Basic 2010에서는 제네릭 인터페이스의 가변성(공변성[Covariance]과 반공변성[Contravariance])을 지원합니다. 여러 인터페이스를 구현하는 경우 한 인터페이스가 다른 인터페이스에서 파생되면 모호한 인터페이스와 관련된 경고 오류가 발생할 수 있습니다.

자세한 내용은 제네릭 인터페이스의 가변성(C# 및 Visual Basic)을 참조하십시오.

확장 메서드

로컬 메서드는 확장 메서드보다 많이 사용됩니다.

확장 메서드가 형식에 대해 정의된 메서드와 같은 이름과 매개 변수를 사용하여 정의된 경우 컴파일러는 확장 메서드 대신 로컬 메서드에 바인딩합니다. 이 동작은 Visual Basic 2008에서 잘못된 바인딩 동작을 해결합니다. 자세한 내용은 확장 메서드(Visual Basic)를 참조하십시오.

Nullable 값 형식

다음 코드와 같이 = 연산자를 사용하여 Nothing에 대해 nullable 값 형식을 테스트하면 컴파일러 오류가 발생합니다.

Dim i? As Integer
If i = Nothing Then
  ' ...
End If

= 연산자를 사용하여 Nothing에 대해 nullable 값 형식을 테스트하는 경우 결과는 False입니다. 이는 nullable 값 형식이 Nothing인 경우에도 해당되므로 의도한 결과가 아닐 것입니다. 다음 예제와 같이 Is 연산자를 대신 사용합니다.

Dim i? As Integer
If i Is Nothing Then
  ' ...
End If

매개 변수가 없는 함수나 속성의 암시적 호출

함수나 속성이 문자열이나 배열과 같은 인덱싱 가능한 값을 반환하는 경우 약식 구문을 사용하여 함수나 속성의 오버로드가 없는 경우에만 인덱스로 반환 값의 요소를 참조할 수 있습니다.

다음 예제와 같이 인덱싱 가능한 값을 반환하는 매개 변수가 없는 함수나 속성을 고려해 볼 수 있습니다.

Class Sample

    Public Function GetValue() As String
        Return "Default Value"
    End Function

End Class

약식 구문을 사용하여 다음 예제와 같이 인덱스로 반환 값의 요소를 참조할 수 있습니다.

Dim o As Object = New Sample()
' Returns "D" if no overloads exist for the GetValue function.
Dim val = o.GetValue(0)

Visual Basic 2008에서는 함수나 속성의 오버로드가 있는 경우에도 런타임에 바인딩된 호출에 이 약식 구문을 사용할 수 있습니다. Visual Basic 2010에서는 약식 구문을 사용하여 함수나 속성의 오버로드가 없는 경우에만 인덱스로 반환 값의 요소를 참조할 수 있습니다.

Class 제약 조건

Class 제약 조건이 더 이상 가정되지 않습니다.

Visual Basic 2008에서는 Class 제약 조건으로 제한되는 또 다른 제네릭 매개 변수로 제한되는 제네릭 매개 변수에 대한 Class 제약 조건을 유추합니다. Visual Basic 2010에서는 제네릭 매개 변수가 Class 제약 조건을 "상속"한다고 더 이상 유추하지 않습니다. 이는 첫 번째 제네릭 매개 변수가 인터페이스를 구현하지만 클래스는 아닌 형식을 사용하여 인스턴스화될 수 있기 때문입니다. 인터페이스는 Class 제약 조건을 충족합니다.

제네릭 매개 변수가 클래스로 제한되도록 하려면 다음 예제와 같이 Class 제약 조건을 추가합니다.

    ' The following code causes a compiler error.
    ' Function RefEquals(Of T1 As T2, T2 As Class)(ByVal x As T1, ByVal y As T2) As Boolean
    '     Return y Is x
    ' End Function

    ' The following code is valid in Visual Basic 2010.
    Function RefEquals(Of T1 As {T2, Class}, T2 As Class)(ByVal x As T1, ByVal y As T2) As Boolean
        Return y Is x
    End Function

자세한 내용은 Visual Basic의 제네릭 형식(Visual Basic)을 참조하십시오.

Partial 클래스 메서드

제네릭 매개 변수를 제한하는 메서드가 둘 이상의 partial 클래스에서 선언된 경우 메서드의 모든 선언에 동일한 제약 조건이 있어야 합니다.

제네릭 매개 변수가 있는 메서드를 둘 이상의 partial 클래스에서 선언할 수 있습니다. Visual Basic 2008에서는 컴파일러가 제네릭 매개 변수에 대한 제약 조건이 메서드의 모든 선언에 대해 일치하도록 항상 요구하지는 않습니다. Visual Basic 2010에서는 메서드의 모든 선언에 동일한 제약 조건이 있어야 합니다.

자세한 내용은 Visual Basic의 제네릭 형식(Visual Basic)을 참조하십시오.

람다 식의 식 트리

제네릭 매개 변수 형식 인스턴스의 불필요한 boxing이 제거되었습니다.

Visual Basic 2008에서는 람다 식의 식 트리 내부에서 제네릭 매개 변수 형식이 인터페이스로 제한되는 경우 이 형식의 인스턴스에서 메서드를 호출하면 해당 인스턴스가 항상 boxing됩니다. Visual Basic 2010에서는 필요한 경우에만 인스턴스가 boxing됩니다.

boxing과 unboxing에 대한 자세한 내용은 Visual Basic 언어 사양을 참조하십시오.

람다 식 및 식 트리

람다 식의 식 트리가 람다 식의 식 트리에서 반환될 수 있습니다.

Visual Basic 2008에서 람다 식이 람다 식을 식 트리로 캐스팅하는 경우 컴파일러가 캐스팅을 수행하지 않는 경우가 있습니다. Visual Basic 2010 컴파일러는 캐스팅이 람다 식 안에서 발생하는 경우 람다 식을 식 트리로 올바르게 캐스팅합니다.

참고 항목

개념

Visual Basic 2010의 새로운 기능

기타 리소스

Visual Basic 시작