协变与逆变的理解

一,问题描述

wechat_2025-08-25_091145_222

 

按道理来说 一堆苹果就属于水果范围内,但实际不然。

我们先来了结下下面的知识点再来处理上述问题。

 

二,定义:

协变(Covariance)是一种允许将派生类类型替换为基类类型的特性。这种特性通常用于泛型类型或委托中,特别是在返回类型时。协变的主要目的是提高代码的灵活性和可重用性,使得在使用派生类时能够有效地利用基类的接口或方法。

协变是指在泛型类型的使用中,允许将某个类型参数替换为该参数的派生类。换句话说,协变允许你在泛型委托或接口中使用更具体的类型。在C#中,协变通常用于返回值的情况。

在C#中,可以通过使用out关键字来声明协变类型参数。下面是协变的基本语法:

public delegate TResult MyDelegate<out TResult>();

这里,TResult 参数前面加了out关键字,表明这个类型参数是协变的。返回类型可以是派生类。

逆变(Contravariance)是与协变相反的特性,允许将基类类型替换为派生类类型。逆变主要用于参数类型的上下文,特别是在方法参数时。通过逆变,我们可以使用更通用的类型来替代特定的类型,从而提高代码的灵活性和可重用性。

逆变是指在泛型类型的使用中,允许将某个类型参数替换为该参数的基类。这种特性通常在需要处理不同类型的对象时非常有用。表现在代码上就是某个函数的参数类型是基类类型,但是可以接受其派生类类型的实参。

在C#中,可以通过使用 in 关键字来声明逆变类型参数。下面是逆变的基本语法:

public delegate void MyDelegate<in T>();

三,泛型接口与委托在协变逆变中的表现

 

wechat_2025-08-25_091541_680

 

 

 

四:问题的解决

wechat_2025-08-25_091736_825

 

 

 

使用 in 和 out 关键字只适用于委托和接口,不适用于类、结构和方法。

 

posted @ 2025-08-25 09:21  C#菜鸟……  阅读(12)  评论(0)    收藏  举报