Каковы преимущества ковариации и контравариантности? - PullRequest
15 голосов
/ 29 апреля 2009

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

Ответы [ 4 ]

7 голосов
/ 29 апреля 2009

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

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

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

5 голосов
/ 29 апреля 2009

Существует множество заблуждений относительно того, как и что будет работать в 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 вы не сможете передать Список в этот метод. Как указывает Марк, для этого существуют общие ограничения, которые могут быть выполнены начиная с 2.0

2 голосов
/ 29 апреля 2009

Одно из преимуществ, которое, на мой взгляд, ковариация очень поможет, это 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;

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

1 голос
/ 29 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...