Share via


In (Generic Modifier) (Visual Basic)

Voor algemene typeparameters geeft het In trefwoord aan dat de typeparameter contravariant is.

Opmerkingen

Met Contravariantie kunt u een minder afgeleid type gebruiken dan het type dat is opgegeven door de algemene parameter. Dit maakt impliciete conversie mogelijk van klassen die variantinterfaces implementeren en impliciete conversie van gedelegeerde typen.

Zie Covariantie en Contravariantie voor meer informatie.

Regels

U kunt het In trefwoord gebruiken in algemene interfaces en gemachtigden.

Een typeparameter kan contravariant worden gedeclareerd in een algemene interface of gemachtigde als deze alleen wordt gebruikt als een type methodeargumenten en niet wordt gebruikt als retourtype methode. ByRef parameters kunnen geen covariant of contravariant zijn.

Covariantie en contravariantie worden ondersteund voor referentietypen en niet ondersteund voor waardetypen.

In Visual Basic kunt u geen gebeurtenissen declareren in contravariantinterfaces zonder het type gedelegeerde op te geven. Contravariante interfaces kunnen ook geen geneste klassen, opsommingen of structuren hebben, maar ze kunnen geneste interfaces hebben.

Gedrag

Met een interface met een parameter voor het contravarianttype kunnen de methoden argumenten accepteren van minder afgeleide typen dan de parameters die zijn opgegeven door de parameter van het interfacetype. Omdat in .NET Framework 4, in de IComparer<T> interface, type T contravariant is, kunt u bijvoorbeeld een object van het IComparer(Of Person) type toewijzen aan een object van het IComparer(Of Employee) type zonder speciale conversiemethoden te gebruiken als Employee deze worden overgenomen van Person.

Aan een contravariant gedelegeerde kan een andere gemachtigde van hetzelfde type worden toegewezen, maar met een minder afgeleide algemene typeparameter.

Voorbeeld: algemene interface voor contravariant

In het volgende voorbeeld ziet u hoe u een algemene interface voor contravariant declareert, uitbreidt en implementeert. U ziet ook hoe u impliciete conversie kunt gebruiken voor klassen die deze interface implementeren.

' 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

Voorbeeld: algemene gedelegeerde voor contravariant

In het volgende voorbeeld ziet u hoe u een algemene gemachtigde kunt declareren, instantiƫren en aanroept. U ziet ook hoe u impliciet een type gedelegeerde kunt converteren.

' 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

Zie ook