Каковы преимущества ковариации и контравариантности?
С# 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
Там хорошая запись, в которой говорится об этом вопросе здесь.