C#数组协方差
对于任意两个“引用类型”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[]来处理的转换。
最新文章
- springmvc配置文件web.xml详解各方总结(转载)
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
- 通用权限管理系统组件3.9 的 Oracle 数据库创建脚本参考
- loadrunner常用函数
- Linux 系统裁剪
- xml格式化写入文件
- zabbix 邮件告警配置
- QTP使用技巧
- php 语言特点
- java web--DOM
- Python多线程操作
- Python导出MySQL数据库中表的建表语句到文件
- 【转载】 详解BN(Batch Normalization)算法
- ASP.NET MVC 项目文件夹结构
- Jupyter Notebook的使用
- Php与Erlang的Socket通信
- android RecyclerView (二) ItemDecoration 详解
- hdu 1162 Eddy&#39;s picture(最小生成树算法)
- WPF TabItem.Collapse 的问题
- HDU 6191 Query on A Tree(可持久化Trie+DFS序)