In(제네릭 한정자)(Visual Basic)
제네릭 형식 매개 변수에서 In
키워드는 형식 매개 변수를 반공변(contravariant)으로 지정합니다.
설명
반공변성(Contravariance)을 통해 제네릭 매개 변수에 지정된 것보다 적은 파생 형식을 사용할 수 있습니다. 따라서 variant 인터페이스를 구현하는 클래스의 암시적 변환과 대리자 형식의 암시적 변환이 허용됩니다.
자세한 내용은 공변성(Covariance) 및 반공변성(Contravariance)을 참조하세요.
규칙
제네릭 인터페이스 및 대리자에서 In
키워드를 사용할 수 있습니다.
형식 매개 변수가 메서드 인수의 형식으로만 사용되고 메서드 반환 형식으로 사용되지 않는 경우 이를 제네릭 인터페이스 또는 대리자에서 반공변으로 선언할 수 있습니다. ByRef
매개 변수는 공변 또는 반공변일 수 없습니다.
공변성(Covariance) 및 반공변성(Contravariance)은 참조 형식은 지원되고 값 형식은 지원되지 않습니다.
Visual Basic에서는 대리자 형식을 지정하지 않고는 공변 인터페이스에서 이벤트를 선언할 수 없습니다. 또한 반공변 인터페이스는 중첩된 클래스, 열거형 또는 구조체가 있을 수 없지만 중첩된 인터페이스는 있을 수 있습니다.
동작
반공변(contravariant) 형식 매개 변수가 있는 인터페이스는 해당 메서드가 인터페이스 형식 매개 변수에 지정된 형식보다 덜 파생된 형식의 인수를 사용할 수 있도록 합니다. 예를 들어 .NET Framework 4의 IComparer<T> 인터페이스에서 T 형식은 반공변(contravariant)이므로 Employee
이(가) Person
을(를) 상속하는 경우 특수 변환 메서드를 사용하지 않고 IComparer(Of Person)
형식의 개체를 IComparer(Of Employee)
형식의 개체에 할당할 수 있습니다.
반공변(contravariant) 대리자에 동일한 형식의 다른 대리자를 할당할 수 있지만 덜 파생된 제네릭 형식 매개 변수가 필요합니다.
예 - 반공변 제네릭 인터페이스
다음 예제에서는 반공변(contravariant) 제네릭 인터페이스를 선언, 확장 및 구현하는 방법을 보여 줍니다. 또한 이 인터페이스를 구현하는 클래스에 대해 암시적 변환을 사용하는 방법을 보여 줍니다.
' Contravariant interface.
Interface IContravariant(Of In A)
End Interface
' Extending contravariant interface.
Interface IExtContravariant(Of In A)
Inherits IContravariant(Of A)
End Interface
' Implementing contravariant interface.
Class Sample(Of A)
Implements IContravariant(Of A)
End Class
Sub Main()
Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()
Dim istr As IContravariant(Of String) = New Sample(Of String)()
' You can assign iobj to istr, because
' the IContravariant interface is contravariant.
istr = iobj
End Sub
예 - 반공변 제네릭 대리자
다음 예제에서는 반공변(contravariant) 제네릭 대리자를 선언, 인스턴스화 및 호출하는 방법을 보여 줍니다. 또한 대리자 형식을 암시적으로 변환하는 방법을 보여 줍니다.
' Contravariant delegate.
Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)
' Methods that match the delegate signature.
Public Shared Sub SampleControl(ByVal control As Control)
End Sub
Public Shared Sub SampleButton(ByVal control As Button)
End Sub
Private Sub Test()
' Instantiating the delegates with the methods.
Dim dControl As DContravariant(Of Control) =
AddressOf SampleControl
Dim dButton As DContravariant(Of Button) =
AddressOf SampleButton
' You can assign dControl to dButton
' because the DContravariant delegate is contravariant.
dButton = dControl
' Invoke the delegate.
dButton(New Button())
End Sub
참고 항목
.NET