Скажем, Class2 является производным от Class1, потому что язык C # является ковариантным, когда дело доходит до назначения массивов, следующее присваивание совершенно допустимо
Class1[] generalizedArray;
Class2[] specializedArray = new Class2[]{new Class2(),new Class2()};
generalizedArray= specializedArray;
Но на полпути, если вы назначите такой элемент
generalizedArray[0]=new Class1()
Компилятор даже не выдаст предупреждение.Вместо этого вы получите неприятную ArrayTypeMismatchException во время выполнения.Это потому, что вы не можете иметь два типа объектов в массиве, как указано выше
Подробнее о ковариантности, контравариантности и инвариантности в языке C # см. http://geekswithblogs.net/Martinez/archive/2008/12/30/covariance-contravariance-and-invariance-in-c-language.aspx