제네릭 형식 매개 변수의 Out
경우 키워드는 형식이 공변성임을 지정합니다.
비고
공변성에서는 제네릭 매개 변수에 지정된 것보다 더 많은 파생 형식을 사용할 수 있습니다. 이렇게 하면 변형 인터페이스를 구현하는 클래스를 암시적으로 변환하고 대리자 형식을 암시적으로 변환할 수 있습니다.
자세한 내용은 공변성 및 반공변성(Contravariance)을 참조하세요.
규칙
제네릭 인터페이스 및 대리자 Out
에서 키워드를 사용할 수 있습니다.
제네릭 인터페이스에서 형식 매개 변수는 다음 조건을 충족하는 경우 공변성으로 선언할 수 있습니다.
형식 매개 변수는 인터페이스 메서드의 반환 형식으로만 사용되며 메서드 인수의 형식으로 사용되지 않습니다.
비고
이 규칙에는 한 가지 예외가 있습니다. 공변 인터페이스에 반공변 제네릭 대리자가 메서드 매개 변수로 있는 경우 공변 형식을 이 대리자의 제네릭 형식 매개 변수로 사용할 수 있습니다. 공변성 및 반공변 제네릭 대리자에 대한 자세한 내용은 대리자에서의 분산 및 Func 및 작업 제네릭 대리자에서 분산 사용을 참조하세요.
형식 매개 변수는 인터페이스 메서드에 대한 제네릭 제약 조건으로 사용되지 않습니다.
제네릭 대리자에서 형식 매개 변수는 메서드 반환 형식으로만 사용되고 메서드 인수에 사용되지 않는 경우 공변성으로 선언할 수 있습니다.
공변성 및 반공변은 참조 형식에 대해 지원되지만 값 형식에는 지원되지 않습니다.
Visual Basic에서는 대리자 형식을 지정하지 않고는 공변 인터페이스에서 이벤트를 선언할 수 없습니다. 또한 공변 인터페이스에는 중첩 클래스, 열거형 또는 구조체가 있을 수 없지만 중첩된 인터페이스가 있을 수 있습니다.
행동
공변 형식 매개 변수가 있는 인터페이스를 사용하면 해당 메서드가 형식 매개 변수로 지정된 형식보다 더 많은 파생 형식을 반환할 수 있습니다. 예를 들어 .NET Framework 4에서 IEnumerable<T>T 형식은 공변이므로 특수 변환 메서드를 사용하지 않고 형식의 개체 IEnumerable(Of String)
를 형식의 IEnumerable(Of Object)
개체에 할당할 수 있습니다.
공변 대리자는 동일한 형식의 다른 대리자를 할당할 수 있지만 더 파생된 제네릭 형식 매개 변수를 사용할 수 있습니다.
예제 1
다음 예제에서는 공변 제네릭 인터페이스를 선언, 확장 및 구현하는 방법을 보여줍니다. 또한 공변 인터페이스를 구현하는 클래스에 암시적 변환을 사용하는 방법을 보여 줍니다.
' Covariant interface.
Interface ICovariant(Of Out R)
End Interface
' Extending covariant interface.
Interface IExtCovariant(Of Out R)
Inherits ICovariant(Of R)
End Interface
' Implementing covariant interface.
Class Sample(Of R)
Implements ICovariant(Of R)
End Class
Sub Main()
Dim iobj As ICovariant(Of Object) = New Sample(Of Object)()
Dim istr As ICovariant(Of String) = New Sample(Of String)()
' You can assign istr to iobj because
' the ICovariant interface is covariant.
iobj = istr
End Sub
예제 2
다음 예제에서는 공변 제네릭 대리자를 선언, 인스턴스화 및 호출하는 방법을 보여줍니다. 또한 대리자 형식에 암시적 변환을 사용하는 방법도 보여줍니다.
' Covariant delegate.
Public Delegate Function DCovariant(Of Out R)() As R
' Methods that match the delegate signature.
Public Shared Function SampleControl() As Control
Return New Control()
End Function
Public Shared Function SampleButton() As Button
Return New Button()
End Function
Private Sub Test()
' Instantiating the delegates with the methods.
Dim dControl As DCovariant(Of Control) =
AddressOf SampleControl
Dim dButton As DCovariant(Of Button) =
AddressOf SampleButton
' You can assign dButton to dControl
' because the DCovariant delegate is covariant.
dControl = dButton
' Invoke the delegate.
dControl()
End Sub
참고하십시오
.NET