【发布时间】:2010-03-03 05:58:12
【问题描述】:
我已经指定了几个接口,我正在使用 Entity Framework 4 将它们实现为实体。我能想到的最简单的演示代码是:
public class ConcreteContainer : IContainer
{
public EntityCollection<ConcreteChild> Children { get; set; }
}
public class ConcreteChild : IChild
{
}
public interface IContainer
{
IEnumerable<IChild> Children { get; set; }
}
public interface IChild
{
}
我从上面收到以下编译器错误:
'Demo.ConcreteContainer' 确实 不实现接口成员 'Demo.IContainer.Children'。 'Demo.ConcreteContainer.Children' 无法实施 'Demo.IContainer.Children' 因为它没有匹配 返回类型 'System.Collections.Generic.IEnumerable'
我目前的理解是,这是因为IEnumerable(由 EntityCollection 实现)是协变的,但可能不是逆变的:
此类型参数是协变的。也就是说,您可以使用 您指定的类型或任何更多的类型 衍生的。有关协变和逆变的更多信息, 请参阅泛型中的协变和逆变。
我是否正确,如果正确,有什么方法可以实现我的目标,即纯粹根据其他接口而不是使用具体类来指定 IContainer 接口?
或者,我是否误解了更基本的东西?
【问题讨论】:
标签: c# covariance