Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Med ett covariant-gränssnitt kan dess metoder returnera fler härledda typer än de som anges i gränssnittet. Med ett kontravariant gränssnitt kan dess metoder acceptera parametrar av mindre härledda typer än de som anges i gränssnittet.
I .NET Framework 4 blev flera befintliga gränssnitt samtidiga och kontravarianta. Dessa inkluderar IEnumerable<T> och IComparable<T>. På så sätt kan du återanvända metoder som fungerar med generiska samlingar av bastyper för samlingar av härledda typer.
En lista över variantgränssnitt i .NET Framework finns i Varians i Generiska gränssnitt (Visual Basic).
Konvertera allmänna samlingar
I följande exempel visas fördelarna med samvariansstöd i IEnumerable<T> gränssnittet. Metoden PrintFullName accepterar en samling av typen IEnumerable(Of Person) som en parameter. Du kan dock återanvända den för en samling av typen IEnumerable(Of Person) eftersom Employee ärver Person.
' Simple hierarchy of classes.
Public Class Person
    Public Property FirstName As String
    Public Property LastName As String
End Class
Public Class Employee
    Inherits Person
End Class
' The method has a parameter of the IEnumerable(Of Person) type.
Public Sub PrintFullName(ByVal persons As IEnumerable(Of Person))
    For Each person As Person In persons
        Console.WriteLine(
            "Name: " & person.FirstName & " " & person.LastName)
    Next
End Sub
Sub Main()
    Dim employees As IEnumerable(Of Employee) = New List(Of Employee)
    ' You can pass IEnumerable(Of Employee),
    ' although the method expects IEnumerable(Of Person).
    PrintFullName(employees)
End Sub
Jämföra generiska samlingar
I följande exempel visas fördelarna med kontravariansstöd i IComparer<T> gränssnittet. Klassen PersonComparer implementerar gränssnittet IComparer(Of Person). Du kan dock återanvända den här klassen för att jämföra en sekvens med objekt av typen Employee eftersom Employee ärver Person.
' Simple hierarchy of classes.
Public Class Person
    Public Property FirstName As String
    Public Property LastName As String
End Class
Public Class Employee
    Inherits Person
End Class
' The custom comparer for the Person type
' with standard implementations of Equals()
' and GetHashCode() methods.
Class PersonComparer
    Implements IEqualityComparer(Of Person)
    Public Function Equals1(
        ByVal x As Person,
        ByVal y As Person) As Boolean _
        Implements IEqualityComparer(Of Person).Equals
        If x Is y Then Return True
        If x Is Nothing OrElse y Is Nothing Then Return False
        Return (x.FirstName = y.FirstName) AndAlso
            (x.LastName = y.LastName)
    End Function
    Public Function GetHashCode1(
        ByVal person As Person) As Integer _
        Implements IEqualityComparer(Of Person).GetHashCode
        If person Is Nothing Then Return 0
        Dim hashFirstName =
            If(person.FirstName Is Nothing,
            0, person.FirstName.GetHashCode())
        Dim hashLastName = person.LastName.GetHashCode()
        Return hashFirstName Xor hashLastName
    End Function
End Class
Sub Main()
    Dim employees = New List(Of Employee) From {
        New Employee With {.FirstName = "Michael", .LastName = "Alexander"},
        New Employee With {.FirstName = "Jeff", .LastName = "Price"}
    }
    ' You can pass PersonComparer,
    ' which implements IEqualityComparer(Of Person),
    ' although the method expects IEqualityComparer(Of Employee)
    Dim noduplicates As IEnumerable(Of Employee) = employees.Distinct(New PersonComparer())
    For Each employee In noduplicates
        Console.WriteLine(employee.FirstName & " " & employee.LastName)
    Next
End Sub