Visual Basic에서는 공변성 및 반공변성으로 배열 형식, 대리자 형식 및 제네릭 형식 인수에 대한 암시적 참조 변환이 가능합니다. 공변성은 할당 호환성을 유지하고 반공변성은 반대로 합니다.
다음 코드에서는 할당 호환성, 공변성 및 반공변성 간의 차이를 보여 줍니다.
' Assignment compatibility.
Dim str As String = "test"
' An object of a more derived type is assigned to an object of a less derived type.
Dim obj As Object = str
' Covariance.
Dim strings As IEnumerable(Of String) = New List(Of String)()
' An object that is instantiated with a more derived type argument
' is assigned to an object instantiated with a less derived type argument.
' Assignment compatibility is preserved.
Dim objects As IEnumerable(Of Object) = strings
' Contravariance.
' Assume that there is the following method in the class:
' Shared Sub SetObject(ByVal o As Object)
' End Sub
Dim actObject As Action(Of Object) = AddressOf SetObject
' An object that is instantiated with a less derived type argument
' is assigned to an object instantiated with a more derived type argument.
' Assignment compatibility is reversed.
Dim actString As Action(Of String) = actObject
배열의 공변성으로 더 파생된 형식의 배열을 덜 파생된 형식의 배열로 암시적으로 변환할 수 있습니다. 그러나 다음 코드 예제와 같이 이 작업은 유형 안전하지 않습니다.
Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception.
' array(0) = 10
메서드 그룹에 대한 공변성 및 반공변성 지원을 사용하면 메서드 시그니처를 대리자 형식과 일치할 수 있습니다. 이 일치를 사용하면 일치하는 서명이 있는 메서드뿐만 아니라 다음과 같은 메서드를 대리자에게 할당할 수 있습니다.
- 대리자 형식에 지정된 반환 형식보다 더 많은 파생 형식(공변성)을 반환합니다.
- 대리자 형식에서 지정한 것보다 파생 형식(반공변성)이 적은 매개 변수를 허용합니다.
자세한 내용은 대리자에서의 분산(Visual Basic) 및 대리자에서 분산 사용(Visual Basic)을 참조하세요.
다음 코드 예제에서는 메서드 그룹에 대한 공변성 및 반공변성 지원을 보여줍니다.
Shared Function GetObject() As Object
Return Nothing
End Function
Shared Sub SetObject(ByVal obj As Object)
End Sub
Shared Function GetString() As String
Return ""
End Function
Shared Sub SetString(ByVal str As String)
End Sub
Shared Sub Test()
' Covariance. A delegate specifies a return type as object,
' but you can assign a method that returns a string.
Dim del As Func(Of Object) = AddressOf GetString
' Contravariance. A delegate specifies a parameter type as string,
' but you can assign a method that takes an object.
Dim del2 As Action(Of String) = AddressOf SetObject
End Sub
.NET Framework 4 이상에서 Visual Basic은 제네릭 인터페이스 및 대리자의 공변성 및 반공변을 지원하며 제네릭 형식 매개 변수의 암시적 변환을 허용합니다. 자세한 내용은 제네릭 인터페이스의 분산(Visual Basic) 및 대리자 차이(Visual Basic)를 참조하세요.
다음 코드 예제에서는 제네릭 인터페이스에 대한 암시적 참조 변환을 보여 줍니다.
Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings
제네릭 매개 변수가 공변 또는 반공변으로 선언된 경우 제네릭 인터페이스 또는 대리자를 variant 라고 합니다. Visual Basic을 사용하면 고유한 변형 인터페이스 및 대리자를 만들 수 있습니다. 자세한 내용은 변형 제네릭 인터페이스 만들기(Visual Basic) 및 대리자에서 분산(Visual Basic)을 참조하세요.
관련 문서
제목 | 설명 |
---|---|
제네릭 인터페이스의 분산(Visual Basic) | 제네릭 인터페이스의 공변성 및 반공변에 대해 설명하고 .NET Framework의 변형 제네릭 인터페이스 목록을 제공합니다. |
변형 제네릭 인터페이스 생성(Visual Basic) | 사용자 지정 변형 인터페이스를 만드는 방법을 보여 줍니다. |
제네릭 컬렉션에 대한 인터페이스에서 가변성 사용(Visual Basic) | IEnumerable<T> 및 IComparable<T> 인터페이스의 공변성과 반공변성 지원이 코드를 재사용하는 데 어떻게 도움이 되는지 보여 줍니다. |
대리자 차이(Visual Basic) | 제네릭 대리자와 제네릭이 아닌 대리자의 공변성 및 반공변성을 논의하고, .NET Framework의 변형 제네릭 대리자 목록을 제공합니다. |
대리자에서 가변성 사용(Visual Basic) | 제네릭이 아닌 대리자에서 공변성 및 반공변성 지원을 사용하여 메서드 시그니처를 대리자 형식과 일치시킬 수 있는 방법을 보여 줍니다. |
Visual Basic에서 Func 및 Action 제네릭 대리자의 다양성 사용 |
Func 및 Action 대리자의 공변성과 반공변성 지원이 코드 재사용에 어떻게 도움이 되는지를 보여줍니다. |
.NET