对于任意两个“引用类型”A和B,如果存在从A到B的隐式引用转换或显式引用转换,则也一定存在从数组类型A[R]到数组类型B[R]的相同的引用转换,其中R可以是任何给定的“秩说明符”,但是这两个数组类型必须使用相同的R,这种关系称为数组协方差。具体来说,数组协方差就是数组类型A[R]的值实际上可能是对数组类型B[R]的实例的引用(如果存在从B到A的隐式引用转换的话)。

由于存在数组协方差,对引用类型数组的元素的赋值操作会包括一个运行时检查,以确保正在赋给数组元素的值确实是允许的类型。

例如:
 
class Test
{
   static void Fill(object[] array, int index, int count, object value) {
      for (int i = index; i < index + count; i++) array[i] = value;
   }
   static void Main() {
      string[] strings = new string[100];
      Fill(strings, 0, 100, "Undefined");
      Fill(strings, 0, 10, null);
      Fill(strings, 90, 10, 0);
   }
}

Fill方法中对array[i]的赋值隐式地包括一个运行时检查,它确保由value引用的对象是null或者是与array的实际元素类型兼容的类型的实例。在Main中,Fill的前两个调用成功了,但是在第三个调用中,当执行对array[i]的第一次赋值时会引发System.ArrayTypeMismatchException。发生此异常是因为装箱的int类型不能存储于string数组中。

具体来说,数组协方差不能延伸到“值类型”的数组。例如,不存在允许将int[]当作object[]来处理的转换。

最新文章

  1. springmvc配置文件web.xml详解各方总结(转载)
  2. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
  3. 通用权限管理系统组件3.9 的 Oracle 数据库创建脚本参考
  4. loadrunner常用函数
  5. Linux 系统裁剪
  6. xml格式化写入文件
  7. zabbix 邮件告警配置
  8. QTP使用技巧
  9. php 语言特点
  10. java web--DOM
  11. Python多线程操作
  12. Python导出MySQL数据库中表的建表语句到文件
  13. 【转载】 详解BN(Batch Normalization)算法
  14. ASP.NET MVC 项目文件夹结构
  15. Jupyter Notebook的使用
  16. Php与Erlang的Socket通信
  17. android RecyclerView (二) ItemDecoration 详解
  18. hdu 1162 Eddy&#39;s picture(最小生成树算法)
  19. WPF TabItem.Collapse 的问题
  20. HDU 6191 Query on A Tree(可持久化Trie+DFS序)

热门文章

  1. SpringMVC基础配置及使用
  2. Light Pre-Pass 渲染器----为多光源设计一个渲染器
  3. 洛谷P1722 矩阵 II(Catalan数)
  4. IDEA热部署自动重启服务问题
  5. C 语言实例 - 求两数的最大公约数
  6. docker镜像删除
  7. 线程组之间的JMeter传递变量
  8. blur和focus的运用
  9. C# 流
  10. python进阶03 继承