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

为什么我无法分配列表 到清单?

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

为什么我无法分配列表 到清单?

下面的示例是理解为什么不允许这样做的最简单方法:

abstract class Fruit{}class Apple : Fruit{}class Banana : Fruit{}// This should intuitively compile right? Cause an Apple is Fruit.List<Fruit> fruits = new List<Apple>();// But what if I do this? Adding a Banana to a list of Applesfruits.Add(new Banana());

最后一条语句将破坏.NET的类型安全性。

但是,数组允许这样做:

Fruit[] fruits = new Apple[10]; // This is perfectly fine

然而,把一个

Banana
进入
fruits
还是会破坏类型安全,所以为此.NET必须做对每一个阵列插入类型检查,并抛出一个异常,如果它不是真正的
Apple
。这可能对性能造成很小的影响,但是可以通过
struct
围绕这两种类型创建包装器来规避,因为对于值类型不会执行此检查(因为它们不能从任何东西继承)。刚开始,我不明白为什么要做出这个决定,但是您会经常遇到为什么这样做很有用。最常见的是
String.Format
,它可以接受
paramsobject[]
任何数组。

但是,在.NET 4中,有一个类型为safe covariance /
contravariance的安全协方差/协方差,您可以进行这样的分配,但前提是必须证明它们是安全的。有什么可证明的安全性?

IEnumerable<Fruit> fruits = new List<Apple>();

以上在.NET 4中起作用,因为

IEnumerable<T>
成为了
IEnumerable<out T>
。在
out
该手段
T
只能永远都 出来
fruits
,并且有 没有一种方法在所有
IEnumerable<outT>
有史以来采用
T
的参数,这样你就可以永远正确传递
Banana
IEnumerable<Fruit>

矛盾几乎是相同的,但我总是忘记它的确切细节。毫不奇怪,为此,现在

in
在类型参数上使用了关键字。



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

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

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