C# 6.0 в двух словах Джозефом Альбахари и Бен Альбахари (O'Reilly).Ошибки времени выполнения Ковариации
Copyright 2016 Joseph Albahari and Ben Albahari, 978-1-491-92706-9.
состояния, на страницах 123-124, с относительно типа ковариации:
Массивы, по историческим причинам, типы массивов поддержки ковариации. Этот означает, что B [] может быть отлит до A [], если B-подклассы A (и оба являются ссылочными типами).
Например:
Bear[] bears = new Bear[3];
Animal[] animals = bears; // OK
Недостатком этого повторного является то, что элемент назначения может не во время выполнения:
animals[0] = new Camel(); // Runtime error
Что является причиной такой ошибки? Если вы назначаете экземпляр Bear в экземпляр Animal, будет вызвана ошибка времени выполнения? Я не понимаю, почему это нужно (разрешая такое задание, компилятор должен взять на себя ответственность, заявив «все в порядке, я позволю вам сделать с этим объектом все, что может сделать животное». Поскольку Медведь - это животное, это навлекает . никаких проблем
Я создал свой собственный сценарий, чтобы проверить выше:.
public class X
{
public int Num { get; set; }
public void Method_1()
{
Console.WriteLine("X");
}
public virtual void Method_2()
{
Console.WriteLine(Num);
}
}
public class Y : X
{
public Y()
{
Num = 1000;
}
}
X[] arrayX = new X[] { new X { Num = 1000 }, new X { Num = 999 }, new X { Num = 51762 } };
Y[] arrayY = new Y[] { new Y { Num = 5 }, new Y { Num = 6 }, new Y { Num = 7 } };
X x = new X { Num = 1000 };
Y y = new Y { Num = 50 };
x = y;
arrayX = arrayY;
arrayX[2] = new Y { Num = 1 };
// will print 5,6,1 - no runtime errors faced
foreach (var e in arrayX)
Console.WriteLine(e.Num);
Я считаю, что этот фрагмент коды вышеописанным подражает пример книги - но с моим сниппета, нет ошибок во время выполнения
Что мне не хватает? Как animals[0] = new Camel();
должен был сбросить ошибку времени выполнения, как говорится в книге?
Хотя массив 'animals' выглядит как массив животных, на самом деле это массив медведей. Вы не можете добавить верблюда в массив медведей (очевидно, медведи съели бы верблюда). В вашем примере есть животное (X) и медведь (Y), но отсутствует второй класс детей, например, верблюд. – juharr