位置:首页 > 软件操作教程 > 编程开发 > C# > 问题详情

C# 协变

提问人:刘团圆发布时间:2020-12-08
要把泛型类型参数定义为协变,可在类型定义中使用out关键字,如下面的示例所示:

    public interface IMethaneProducer<out T>{ ... }

对于接口定义,协变类型参数只能用作方法的返回值或属性get访问器。

    说明协变用途的一个很好例子在.NETFramework中,即前面使用的IEnumerable<T>接口。在这个接口中,项类型T定义为协变,这表示可以把支持IEnumerable<Cow>的对象放在IEnumerable<Cow>类型的变量中。

因此下面的代码是有效的:

static void Main(string[] args)

{

    List<Cow> cows = new List<Cow>(); 

    cows.Add(new Cow("Rual")); 

    cows.Add(new SuperCow("Donna"));

    ListAnimals(cows);

    ReadKey();

}

static void ListAnimals(IEnumerable<Animal> animals)

{

    foreach (Animal animal in animals)

    {

        WriteLine(animal.ToString());

    }

}

其中cows变量的类型是List<Cow>,它支持IEnumerable<Cow>接口。通过协变,可以将这个变量传递给需要EEnumerable<Animal>类型的参数的方法。回顾一下foreach循环的工作方式,就知道GetEnumerator()方法用于获取IEnumerator<T>的一个枚举器,该枚举器的Current属性用于访问项。IEnumerator<T>还将其类型参数定义为协变,这表示可以把它用作参数的get访问器,而且一切都运转良好。

继续查找其他问题的答案?

相关视频回答
回复(0)
返回顶部