Say I’ve got this interface:
public interface IFoo
{
string Text {get;}
}
And this class that implements it:
public class Bar : IFoo
{
public string Text
{
get {return "Hello World!";}
}
}
I’ve got a function that takes as an argument a List<IFoo>. When I try to pass it a List<Bar>, I get this compiler error:
Argument 1: cannot convert from System.Collections.Generic.List<Bar>
to System.Collections.Generic.List<IFoo>
Why is this? It seems like that should work for the same reason as if I passed a list of a class that inherits from Bar directly.
Because this disaster can happen:
And now you’ve add an
EvilBarto a list than can only acceptBar. Oops!Basically, you’ve discovered that
T -> List<T>is not covariant inT.