У меня проблемы с пониманием того, почему массивы в C # ковариантны и какую пользу может принести эта ковариация. Рассмотрим следующий пример тривиального кода:
object[] myArray = new string[1];
myArray[0] = 1;
Этот код будет хорошо скомпилирован, но он будет бесцеремонно и, возможно, неудивительно взорваться во время выполнения.
Если я попытаюсь сделать то же самое с помощью обобщений, компилятор будет ворчать на меня, и я пойму, моя глупость на ранней стадии, поэтому мой вопрос таков: почему компилятор C # допускает эту ковариацию с массивами и, более того, каковы потенциальные преимущества?
Eric Lippert говорит:
К сожалению, этот конкретный вид ковариации сломан. Он был добавлен в CLR, потому что Java требует его, и разработчики CLR хотели иметь возможность поддерживать Java-подобные языки. Затем мы поднялись и добавили его в C#, потому что он был в CLR. Это решение было довольно спорным в то время, и я не очень рад этому, но сейчас мы ничего не можем с этим поделать".
У Эрика Липперта есть статья об этом (на самом деле длинная серия о "дисперсии", 11 частей, кажется)
И еще несколько интересных вещей