Aracılığıyla paylaş


Varyans Generic arabirimlerden (C# ve Visual Basic)

.net Framework 4 farkı birkaç varolan genel arabirim desteği sunar.Bu arabirimleri uygulayan sınıflar örtük dönüştürme farkı desteğini etkinleştirir.Aşağıdaki arabirimleri şimdi variant şunlardır:

Kovaryans arabirim genel tür parametresi tarafından tanımlanan daha fazla türetilmiş bir dönüş türü için bir yöntem sağlar.Kovaryans özelliği göstermek için bu generic arabirimlerden düşünün: IEnumerable<Object> ve IEnumerable<String> (IEnumerable(Of Object) ve IEnumerable(Of String) Visual Basic).IEnumerable<String> (IEnumerable(Of String) Visual Basic) arabirimi devralmaz IEnumerable<Object> arabirimi (IEnumerable(Of Object) Visual Basic).Ancak, String türü devralır Object türü ve bazı durumlarda, bu arabirimler, nesneler birbirlerine atamak isteyebilirsiniz.Bu, aşağıdaki kod örneğinde gösterilmiştir.

Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;

Önceki sürümlerinde.net Framework, bu kodu bir derleme hatasına neden oluyor, C# ve Visual Basic ile Option Strict On.Ancak şimdi kullanabilirsiniz strings yerine objects, çünkü önceki örnekte gösterildiği gibi IEnumerable<T> arabirimi değişkenle birlikte.

Contravariance arabiriminin genel parametre tarafından belirtilenden daha az türetilmiş bağımsız değişken türleri için bir yöntem sağlar.Contravariance göstermek için oluşturduğunuz varsayılmıştır bir BaseComparer örnekleri Karşılaştırılacak sınıfı BaseClass sınıfı.BaseComparer Implements sınıfı IEqualityComparer<BaseClass> arabirimi (IEqualityComparer(Of BaseClass) Visual Basic).Çünkü IEqualityComparer<T> arabirimi şimdi karşıtı, kullanabileceğiniz BaseComparer devralır sınıfları karşılaştırmak için BaseClass sınıfı.Bu, aşağıdaki kod örneğinde gösterilmiştir.

' Simple hierarchy of classes.
Class BaseClass
End Class

Class DerivedClass
    Inherits BaseClass
End Class

' Comparer class.
Class BaseComparer
    Implements IEqualityComparer(Of BaseClass)

    Public Function Equals1(ByVal x As BaseClass,
                            ByVal y As BaseClass) As Boolean _
                            Implements IEqualityComparer(Of BaseClass).Equals
        Return (x.Equals(y))
    End Function

    Public Function GetHashCode1(ByVal obj As BaseClass) As Integer _
        Implements IEqualityComparer(Of BaseClass).GetHashCode
        Return obj.GetHashCode
    End Function
End Class
Sub Test()
    Dim baseComparer As IEqualityComparer(Of BaseClass) = New BaseComparer
    ' Implicit conversion of IEqualityComparer(Of BaseClass) to 
    ' IEqualityComparer(Of DerivedClass).
    Dim childComparer As IEqualityComparer(Of DerivedClass) = baseComparer
End Sub
// Simple hierarchy of classes.
class BaseClass { }
class DerivedClass : BaseClass { }

// Comparer class.
class BaseComparer : IEqualityComparer<BaseClass> 
{
    public int GetHashCode(BaseClass baseInstance)
    {
        return baseInstance.GetHashCode();
    }
    public bool Equals(BaseClass x, BaseClass y)
    {
        return x == y;
    }
}
class Program
{
    static void Test()
    {
        IEqualityComparer<BaseClass> baseComparer = new BaseComparer();

        // Implicit conversion of IEqualityComparer<BaseClass> to 
        // IEqualityComparer<DerivedClass>.
        IEqualityComparer<DerivedClass> childComparer = baseComparer;
    }
}

Daha fazla örnek için bkz. Farkı Arabirimleri'nde (C# ve Visual Basic) genel koleksiyonları için kullanma.

Generic arabirimlerden varyans baþvuru türleri için desteklenir.Değer türleri farkı desteklemez.Örneğin, IEnumerable<int> (IEnumerable(Of Integer) Visual Basic) örtük olarak dönüştürülemez IEnumerable<object> (IEnumerable(Of Object) Visual Basic), tamsayı bir değer türü tarafından temsil edilen çünkü.

Dim integers As IEnumerable(Of Integer) = New List(Of Integer)
' The following statement generates a compiler error
' with Option Strict On, because Integer is a value type.
' Dim objects As IEnumerable(Of Object) = integers
IEnumerable<int> integers = new List<int>();
// The following statement generates a compiler errror,
// because int is a value type.
// IEnumerable<Object> objects = integers;

Varyant arabirimleri uygulayan sınıflar hala sabit olduğunu unutmamak gerekir.Örneğin, ancak List<T> değişkenle birlikte arabirimini uygulayan IEnumerable<T>, örtülü olarak dönüştürülemez List<Object> için List<String> (List(Of Object) için List(Of String) Visual Basic).Bu, aşağıdaki kod örneğinde gösterilmiştir.

' The following statement generates a compiler error
' because classes are invariant.
' Dim list As List(Of Object) = New List(Of String)

' You can use the interface object instead.
Dim listObjects As IEnumerable(Of Object) = New List(Of String)
// The following line generates a compiler error
// because classes are invariant.
// List<Object> list = new List<String>();

// You can use the interface object instead.
IEnumerable<Object> listObjects = new List<String>();

Ayrıca bkz.

Başvuru

Farkı Arabirimleri'nde (C# ve Visual Basic) genel koleksiyonları için kullanma

Kavramlar

Variant Generic arabirimlerden (C# ve Visual Basic) oluşturma

Genel Arabirimler

Varyans Temsilciler (C# ve Visual Basic)