Общая дисперсия в .NET 4 здесь не имеет значения. Реализация интерфейса должна соответствовать сигнатуре интерфейса в точности с точки зрения типов.
Например, возьмите ICloneable
, который выглядит так:
public interface ICloneable
{
object Clone();
}
Было бы приятно иметь возможность реализовать это так:
public class Banana : ICloneable
{
public Banana Clone() // Fails: this doesn't implement the interface
{
...
}
}
... но .NET этого не позволяет. Иногда вы можете использовать явную реализацию интерфейса обойти это, например, так:
public class Banana : ICloneable
{
public Banana Clone()
{
...
}
object ICloneable.Clone()
{
return Clone(); // Delegate to the more strongly-typed method
}
}
Однако в вашем случае вы никогда не сможете этого сделать. Рассмотрим следующий код, который будет действителен, если будет считаться, что ConcreteContainer
реализует IContainer
:
IContainer foo = new ConcreteContainer();
foo.Children = new List<IChild>();
Теперь ваш установщик свойств фактически объявлен для работы только с EntityCollection<ConcreteChild>
, поэтому он явно не может работать с любым IEnumerable<IChild>
- в нарушение интерфейса.