In (generický modifikátor) (Visual Basic)
Pro parametry obecného typu In Určuje klíčové slovo, že parametr typu je kontravariantní.
Poznámky
Kontravariance umožňuje použít méně odvozený typ, než který je určen obecným parametrem. To umožňuje implicitní převod tříd, které implementují rozhraní variant a implicitní převod typů delegátů.
Další informace najdete v tématu kovariance a kontravariance.
Pravidla
Klíčové slovo lze použít In v obecných rozhraních a delegátech.
Parametr typu může být deklarovaný jako kontravariantní v obecném rozhraní nebo delegátu, pokud se používá jenom jako typ argumentů metody a nepoužívá se jako návratový typ metody. ByRef parametry nemohou být kovariantní nebo kontravariantní.
Kovariance a kontravariance jsou podporovány pro typy odkazů a nejsou podporovány pro typy hodnot.
v Visual Basic nelze deklarovat události v kontravariantních rozhraních bez určení typu delegáta. Také kontravariantní rozhraní nemohou mít vnořené třídy, výčty nebo struktury, ale mohou mít vnořená rozhraní.
Chování
Rozhraní, které má parametr kontravariantního typu, umožňuje svým metodám přijímat argumenty méně odvozených typů než hodnoty určené parametrem typu rozhraní. například vzhledem k tomu, že v .NET Framework 4 v IComparer<T> rozhraní, typ T je kontravariantní, můžete přiřadit objekt IComparer(Of Person) typu k objektu IComparer(Of Employee) typu bez použití jakýchkoli speciálních metod převodu, pokud Employee dědí z Person .
Kontravariantnímu delegátu lze přiřadit jiný delegát stejného typu, ale s menším odvozeným parametrem obecného typu.
Příklad – kontravariantní obecné rozhraní
Následující příklad ukazuje, jak deklarovat, rozšiřuje a implementovat kontravariantní obecné rozhraní. Také ukazuje, jak lze použít implicitní převod pro třídy, které implementují toto rozhraní.
' 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
Příklad – kontravariantní obecný delegát
Následující příklad ukazuje, jak deklarovat, vytvářet instance a vyvolat kontravariantního obecného delegáta. Také ukazuje, jak lze implicitně převést typ delegáta.
' 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