Почему нам нужны новые ключевые слова для Ковариантности и Контравариантности в C#?

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

** также нужно работать только до (длина -1)

for (int i=0; i<len-1; i++)
{
      if ( sArr[i] > sArr[i+1])
      {
        return false;
        cout<<"notOrdered"<<endl;
      }
}
cout<<"isOrdered"<<endl;
return true;
17
задан Scott Dorman 6 November 2008 в 14:58
поделиться

5 ответов

У Eric Lippert, который работает над языком, есть ряд сообщений на MSDN, который должен помочь разъяснить включенные проблемы:
http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx

При чтении статей, показанных в той ссылке, запустите внизу и обработайте.

В конечном счете Вы доберетесь до #7 (Почему нам нужен синтаксис вообще?) .

18
ответ дан 30 November 2019 в 12:14
поделиться

Мы не делаем на самом деле потребность их, больше затем нам нужно abstract на классах или и out и ref. Они существуют именно так, что мы, как программисты, можем сделать наше намерение совершенно прозрачным, так, чтобы программист обслуживания знал то, что мы делаем, и компилятор может проверить, что мы делаем его правильно.

7
ответ дан 30 November 2019 в 12:14
поделиться

Ну, основная проблема - это, если у Вас есть иерархия классов как:

   class Foo { .. } 

   class Bar : Foo { .. } 

И Вы имеете IEnumerator<Bar>, Вы не можете использовать это в качестве IEnumerator<Foo> даже при том, что это было бы совершенно безопасно. В 3,5 это вызывает большое количество болезненных циркуляций. Эта работа всегда была бы безопасна, но отклонена системой типов, потому что она не знает о ковариантном использовании универсального параметра типа. IEnumerator<Bar> может только возвратиться Bar, и каждый Bar Foo.

Точно так же, если Вы имели IEqualityComparer<Foo>, это может использоваться для сравнения любой пары объектов типа Foo, даже если один или оба Bar, но это не может быть брошено в IEqualityComparer<Bar>, потому что это не знает о контравариантном использовании универсального параметра типа. IEqualityComparer<Foo> только использует объекты типа Foo, и каждый Bar Foo.

Без этих ключевых слов мы вынуждены предположить, что универсальный аргумент может произойти и как аргумент методу и как тип результата метода, и таким образом, мы не можем безопасно позволить ни одно из вышеупомянутых преобразований.

С ними, система типов свободна позволить нам безопасно восходящему и удрученному между теми интерфейсами в направлении, обозначенном ключевым словом, и мы получаем ошибки, указывающие, когда мы нарушили бы дисциплину, требуемую обеспечить ту безопасность.

6
ответ дан 30 November 2019 в 12:14
поделиться

in и out ключевые слова были ключевыми словами начиная с C# 1.0 и использовались в контексте in - и out - параметры к методам.

Ковариантность и контравариантность являются ограничениями на то, как можно реализовать интерфейс. Нет никакого хорошего способа вывести их - единственный путь, я думаю, от использования, и это было бы грязно, и в конце это не будет работать.

1
ответ дан 30 November 2019 в 12:14
поделиться

Jon и Joel оба предоставили довольно полный ответ на это, но нижняя строка - то, что они не так , нуждался компилятором, а скорее справка гарантируют безопасность реализации путем явного указания на различие параметра. Это следует за очень похожим шаблоном к требованию out или ref ключевое слово и на сайте вызова и на сайте объявления.

1
ответ дан 30 November 2019 в 12:14
поделиться
Другие вопросы по тегам:

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