c#泛型的协变和逆变

Posted 一只菜鸟猿的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#泛型的协变和逆变相关的知识,希望对你有一定的参考价值。

例:(引用自Job Log的博客:http://blog.csdn.net/baidu_20993761/article/details/47272597)

public delegate TResult Func<out TResult>();// TResult类型是返回值类型
public delegate TResult Func<in T, out TResult>(T arg); //输入类型T,返回类型TResult
public interface IEnumerable<out T> : IEnumerable // T只出现在返回类型中
public interface IEnumerator<out T> : IDisposable, IEnumerator
public class List<T> : IList<T>, ICollection<T>, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable // 实现变体接口IEnumerable<T>
public class Queue<T> : IEnumerable<T>, ICollection, IEnumerable //  实现变体接口 IEnumerable<T>

 

1、使用out修饰符时,T只能作为返回值。此时泛型的实例是协变的。即该泛型的实例可赋值给T的所有父级类。

2、使用in为修饰符时,T只能作为输入参数。此时泛型的实例是逆变的。即该泛型的实例可赋值给T的所有子类。

 

协变:向上兼容,即兼容所有父类。

逆变:向下兼容,即兼容所有子类。

 

以上是关于c#泛型的协变和逆变的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# (4.0) 不允许泛型类类型中的协变和逆变?

scala中泛型,协变和逆变

Java泛型中的协变和逆变

Typescript 中的协变和逆变

.NET 关于泛型的协变和逆变中 in / out 两个参数(或者方法) 的使用方法和啥时候需要使用。求例子。

了解 C# 中的协变和逆变接口