协变 And 逆变,====================

【Help】 2017-06-01 10:50:55
对于协变和逆变不知道日常中大家是什么情况下会用到?

以下是一个协变的小列子,但是没有体现出具体协变的作用,难道只是为了不子类到父类的不报错吗?他协变后最终是父类的实例,这样做没有看到什么作用,还不如直接就new List<Base>()了,没有看到具体的一个作用

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<Test1> list = new List<Test1>
{
new Test1 {t = "t1"},
new Test1 {t = "t2"}
};

IEnumerable<Base> strings = list;

foreach (var item in strings)
{
Console.WriteLine(item.b);
}
}

}

public class Base
{
public string b { get; set; }
}

public class Test1:Base
{
public string t { get; set; }
}
}
...全文
144 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
【Help】 2017-06-01
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
List<T> 本身不支持多态,也就是说 List<Base> 跟 List<Test1> 并不具有兼容性!那么这个时候就需要写一个类似
var
 result = list.Cast(x=> (Base)x);
这样的转换代码使得 list 能转换为 Base 的可枚举列表。有了协变逆变的 in、out 声明,那么在过程接口就直接支持多态了,不需要自己写列表的转换语句了。
谢谢大牛
闭包客 2017-06-01
  • 打赏
  • 举报
回复
你仔细看会发现,那就是用在委托的输入和输出的,比如 Func 委托。
  • 打赏
  • 举报
回复
List<T> 本身不支持多态,也就是说 List<Base> 跟 List<Test1> 并不具有兼容性!那么这个时候就需要写一个类似
var
 result = list.Cast(x=> (Base)x);
这样的转换代码使得 list 能转换为 Base 的可枚举列表。有了协变逆变的 in、out 声明,那么在过程接口就直接支持多态了,不需要自己写列表的转换语句了。
  • 打赏
  • 举报
回复
多态是什么软件工程背景? 首先有 IEnumerable<Base> strings,这个时候还根本不知道有 Test1 类型呢,是在与这个 strings 变量相关的代码发布了很久才有了扩展,这时候扩展部分需要借助父类来外界打交道、这时候真正需要继承。 不是为了继承而继承,而是真正理解继承。那个时候就不会因为简单的多态概念而怀疑编程方法了。
  • 打赏
  • 举报
回复
协变逆变是为了真正需要多态的场合。你这个代码根本不需要多态,定义一个 IEnumerable<Base> strings 还不如直接定义一个 IEnumerable<Test1> strings 更直接,所以这里你没有体现出多态的工程开发意义所以展出不出需求来!

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧