Почему массивы C # ковариантны и что какую пользу это дает?

У меня проблемы с пониманием того, почему массивы в C # ковариантны и какую пользу может принести эта ковариация. Рассмотрим следующий пример тривиального кода:

object[] myArray = new string[1];
myArray[0] = 1;

Этот код будет хорошо скомпилирован, но он будет бесцеремонно и, возможно, неудивительно взорваться во время выполнения.

Если я попытаюсь сделать то же самое с помощью обобщений, компилятор будет ворчать на меня, и я пойму, моя глупость на ранней стадии, поэтому мой вопрос таков: почему компилятор C # допускает эту ковариацию с массивами и, более того, каковы потенциальные преимущества?

8
задан Drise 6 August 2012 в 17:10
поделиться

2 ответа

Eric Lippert говорит:

К сожалению, этот конкретный вид ковариации сломан. Он был добавлен в CLR, потому что Java требует его, и разработчики CLR хотели иметь возможность поддерживать Java-подобные языки. Затем мы поднялись и добавили его в C#, потому что он был в CLR. Это решение было довольно спорным в то время, и я не очень рад этому, но сейчас мы ничего не можем с этим поделать".

13
ответ дан 5 December 2019 в 09:23
поделиться

У Эрика Липперта есть статья об этом (на самом деле длинная серия о "дисперсии", 11 частей, кажется)

http://blogs.msdn.com/b/ericlippert/archive/2007/10/17/covariance-and-contravariance-in-c-part-two-array-covariance.aspx

И еще несколько интересных вещей

http://blogs.msdn.com/b/ericlippert/archive/2009/09/24/why-is-covariance-of-value-typed-arrays-inconsistent.aspx

4
ответ дан 5 December 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: