操作<列表<东西>&GT;逆变限制</list <something>

时间:2013-12-12 18:17:16

标签: c# list action contravariance

我正在编写一个网络应用程序,其中id请求对象,并通过委托回调返回:

public static void requestById<ModelType>(T id, Action<ModelType> callback)
    where ModelType : AbstractModel<T>
{
}

为方便起见,我有一种方法可以一次请求多个对象:

public static void requestByIds<ModelType>
    (List<T> ids, Action<List<ModelType>> callback)
    where ModelType : AbstractModel<T>, new()
{
}

接下来我有一个有多个孩子的抽象模型对象,以及一个请求孩子的方法:

public abstract void requestSections(Action<List<AbstractSection>> callback);

然后是具体类中的实现:

public override void requestSections(Action<List<AbstractSection>> callback)
{
    Section.requestByIds<Section>(this.sectionIds, callback);
}

突然间,我找到了代表

Action<List<AbstractSection>>

不兼容
Action<List<Section>>

这是C#中逆变的限制吗?有没有任何解决方法,所以我可以让我的覆盖方法工作?感谢

1 个答案:

答案 0 :(得分:5)

List是不变的,它不是协变的或逆变的。

如果您使用的是IEnumerable<T>而不是列表,那么您可以依赖IEnumerable<T>T的重新协调,这会导致Action<IEnumerable<T>>逆变{ {1}}。