小编典典

协方差和反方差的真实世界示例

c#

我在理解如何在现实世界中使用协方差和逆方差时遇到了一些麻烦。

到目前为止,我所看到的唯一示例是相同的旧数组示例。

object[] objectArray = new string[] { "string 1", "string 2" };

如果能看到其他地方使用的示例,那么很高兴能在开发期间使用它。


阅读 416

收藏
2020-05-19

共1个答案

小编典典

假设您有一个Person类和一个从其派生的类Teacher。您有一些操作以a
IEnumerable<Person>作为参数。在您的School课堂中,您有一个返回的方法IEnumerable<Teacher>。协方差允许您将结果直接用于采用的方法,将IEnumerable<Person>更多派生的类型替换为次派生(更通用)的类型。违反直觉,相反,您可以使用更通用的类型,其中指定了更多的派生类型。

另请参见MSDN上泛型中的协方差和协方差

课程

public class Person 
{
     public string Name { get; set; }
}

public class Teacher : Person { }

public class MailingList
{
    public void Add(IEnumerable<out Person> people) { ... }
}

public class School
{
    public IEnumerable<Teacher> GetTeachers() { ... }
}

public class PersonNameComparer : IComparer<Person>
{
    public int Compare(Person a, Person b) 
    { 
        if (a == null) return b == null ? 0 : -1;
        return b == null ? 1 : Compare(a,b);
    }

    private int Compare(string a, string b)
    {
        if (a == null) return b == null ? 0 : -1;
        return b == null ? 1 : a.CompareTo(b);
    }
}

用法

var teachers = school.GetTeachers();
var mailingList = new MailingList();

// Add() is covariant, we can use a more derived type
mailingList.Add(teachers);

// the Set<T> constructor uses a contravariant interface, IComparer<in T>,
// we can use a more generic type than required.
// See https://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx for declaration syntax
var teacherSet = new SortedSet<Teachers>(teachers, new PersonNameComparer());
2020-05-19