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

С# 4.0 будет поддерживать ковариацию и контравариантность. Но я не понимаю преимуществ этой новой функции. Можете ли вы объяснить мне (ясно), зачем нам это нужно?

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

List<Derived> derived....

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

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

Ответ 3

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

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

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;

Здесь хорошая ссылка по этому вопросу.

Ответ 4

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