首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么数组不是反变体?

为什么数组不是反变体?
EN

Stack Overflow用户
提问于 2013-10-13 13:45:11
回答 1查看 218关注 0票数 1

我在想:

在C# 4.0中,泛型接口允许协方差(泛型delegates4也是如此),但是泛型类不允许。

数组支持协方差(如果S子类B,可以将S[]转换为B[] )

因此,这样做是完全有效的:

代码语言:javascript
复制
    string[] obj = new string[3];
        obj[0]="1";
        obj[1]="2";
        obj[2]="3";

Do something with :    (obj as object[])
Do something with :    (object[])obj ...
Do something with :    ((IEnumerable<object>)obj)

但是这种可重用性的缺点是元素赋值可能在运行时失败

代码语言:javascript
复制
 (obj as object[])[0] = new DateTime(); //errrr...

好吧,太好了-它可能会失败。

那么,如果它已经在运行时失败了(这取决于我来检查它),他们为什么不把它作为contravariant呢?

代码语言:javascript
复制
      object[] obj = new object[3];
        obj[0]="1";
        obj[1]="2";
        obj[2]="3";

这样我就能做(我的责任):

代码语言:javascript
复制
(obj as string[])...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-13 14:03:28

它们允许协方差已经够糟糕的了,因为每次写入数组时,即将其元素中的一个设置为新引用,就必须执行类型检查。

如果它们也允许反方差,则数组的每次读取也都需要类型检查。那就更糟了。

在过去的.NET中,数组常常被传递给接收方只能从数组中读取。那么“疯狂的”协方差就有点道理了。反方差没有那么有用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19345918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档