给大家推荐一个NetCore+EFCore的快速开发框架

C# 协变和逆变 精解(直观明了,简单易懂)

只用于泛型接口或委托

out 协变, 可用派生程度更大的子类替换父类型的参数,只能用于方法的返回值

父类本来就可以用子类替换的,但是,在List<父> a=new List<子>();这样的场合就不行了,
因为List<X>本身没有继承关系的,要用IEnumerable<out T>.

 

in 逆变,可用派生程度更小的父类替换子类型参数,只能用于方法的输入参数


比如
interface Ix<out TA,in TB>
{
TA GetTa(TB tb);
//如果输入为TA或输出为TB都会编译不过
}


in 的具体应用,像API的返回值Result封装场景,
成功时返回Result<T>,失败时返回Result<object>,
显示是编译不过的,如果要支持,必须写一个接口IResult<in t>,
接口中没有任何方法和属性,
让Result<T>继承自IResult<T>就好了,

你可能会问,in不是只能做为输入参数么..这里注意,接口里没有写方法,

是在别的普通类的方法里使用了IResult<T>做返回值,根据业务逻辑决定返回T还是TParent,




当是out参数的时候,那么它就要求实际的返回对象至少是父类,或者基于T的子类。

当是in参数的时候:那么他可以T对象实参,也能传T的父类对象实参进去。

posted @ 2013-01-24 14:20  hexllo  阅读(406)  评论(0编辑  收藏  举报

给大家推荐一个NetCore+EFCore的快速开发框架