zoukankan      html  css  js  c++  java
  • 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[]来处理的转换。

  • 相关阅读:
    学习资料
    InstallShield常用工具
    InstallShield中调用API
    系统目录
    abort和exit
    Uninstall Registry Key
    GDI+资料
    VBScript是什么?有什么优缺点?
    DrawImage调查
    KEIL MDK环境下uCOSII在LPC17xx上的移植实例 Chung
  • 原文地址:https://www.cnblogs.com/melao2006/p/4241661.html
Copyright © 2011-2022 走看看