栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C#方差问题:分配列表 作为列表

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#方差问题:分配列表 作为列表

好吧,这当然在C#4中将不受支持。存在一个基本问题:

List<Giraffe> giraffes = new List<Giraffe>();giraffes.Add(new Giraffe());List<Animal> animals = giraffes;animals.Add(new Lion()); // Aargh!

保持长颈鹿的安全:对不安全的差异说不。

数组版本之所以起作用,是因为数组 确实 支持引用类型差异以及执行时间检查。泛型的重点是提供 编译时 类型的安全性。

在C#4中,将支持 安全的 通用变量,但仅支持接口和委托。这样您就可以执行以下操作:

Func<string> stringFactory = () => "always return this string";Func<object> objectFactory = stringFactory; // Safe, allowed in C# 4

Func<out T>
协变的
T
因为
T
仅用于输出位置。比较与之
Action<inT>
相反的
T
原因,因为
T
它仅在此处的输入位置使用,因此很安全:

Action<object> objectAction = x => Console.WriteLine(x.GetHashCode());Action<string> stringAction = objectAction; // Safe, allowed in C# 4

IEnumerable<out T>
也是协变的,这在C#4中是正确的,正如其他人指出的那样:

IEnumerable<Animal> animals = new List<Giraffe>();// Can't add a Lion to animals, as `IEnumerable<out T>` is a read-only interface.

关于在C#2中解决此问题的方式,您是否需要维护 一个 列表,还是愿意创建一个新列表?如果可以接受,

List<T>.ConvertAll
是您的朋友。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576366.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号