Каковы преимущества ковариантности и контравариантности?

вы можете использовать Кордова-плагин-белый список

<access origin="http://example/" /> //specify your domain

16
задан Michael Myers 29 April 2009 в 16:26
поделиться

4 ответа

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

IEnumerable<int> ints = new List<int> { 1, 2, 3 };

Action<IEnumerable<object>> PrintThings =
    x => { foreach(var thing in x) Console.WriteLine(thing); };

PrintThings(ints); // doesn't compile right now :(  will compile in 4.0

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

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

Существует множество заблуждений относительно того, как и что будет работать в 4.0. Лучшее объяснение, которое я прочитал до сих пор, было написано моим Марком Гравеллом. См. Его сообщение в блоге здесь:

http://marcgravell.blogspot.com/2009/02/what-c-40-covariance-doesn-do.html

Просто повторю, многие люди думают, что это будет работать в 4.0:

public class Base{}
public class Derived : Base {}

.. в каком-то другом классе

List<Derived> derived....

public void Method(List<Base> b){}

Даже в 4.0 вы не сможете передать List в этот метод. Как указывает Марк, для этого существуют общие ограничения, которые могут быть выполнены с версии 2.0

5
ответ дан 30 November 2019 в 22:50
поделиться

Здесь есть хорошая статья, в которой говорится об этой проблеме .

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

Одно из преимуществ, которое, на мой взгляд, ковариация очень поможет, это с Generics .

Я столкнулся с несколькими ситуациями где нужно явно использовать приведение к для преобразования определенного типа в его базу.

class Foo { }
class Bar : Foo { }

// ...

IEnumerable<Foo> foos = new List<Foo>();
IEnumerable<Bar> bars = new List<Bar>();

foos = bars.Cast<Foo>();

// C# 4.0
foos = bars;

Вот хорошая ссылка на предмет.

2
ответ дан 30 November 2019 в 22:50
поделиться
Другие вопросы по тегам:

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