在提供的参数中指定的具有协变泛型类型的调用方法

时间:2011-03-20 07:36:37

标签: c# generics covariance

以下out关键字(我不知道,但出于可能对您来说显而易见的原因)不允许:

public static class DataExtensions {
    public static void ReplaceAll<T>(this EntityCollection<T> collectionToReplace, IEnumerable<T> collectionToAdd) where T : EntityObject {
        RemoveEach(collectionToReplace);
        foreach (T item in collectionToAdd) collectionToReplace.Add(item);
    }

    public static void RemoveEach(this EntityCollection<out EntityObject> collectionToEmpty) {
        if (!collectionToEmpty.IsLoaded) collectionToEmpty.Load();
        while (collectionToEmpty.Any()) collectionToEmpty.Remove(collectionToEmpty.First());
    }
}

且没有RemoveEach(collectionToReplace);参数不匹配:

Argument 1: cannot convert from 'System.Data.Objects.DataClasses.EntityCollection<T>' to 'System.Data.Objects.DataClasses.EntityCollection<System.Data.Objects.DataClasses.EntityObject>'

使用特定(非泛型)派生类型调用时也一样。我是否必须使用以下签名?

public static void RemoveEach<T>(this EntityCollection<T> collectionToEmpty) where T : EntityObject {

如果是这样,intellisense或编译器应警告我使用抽象类作为此方法中的泛型类型说明符,因为我刚刚创建了一个不可调用的方法,不是吗?如果你不介意的话,请你指出为什么会这样(例如,如果允许类型安全会被破坏或导致混淆的情况)。

谢谢Shannon

1 个答案:

答案 0 :(得分:2)

你应该可以使用:

public static void RemoveEach<T>(this EntityCollection<T> collectionToEmpty)
    where T : class
{
    if (!collectionToEmpty.IsLoaded) collectionToEmpty.Load();
    while (collectionToEmpty.Any()) collectionToEmpty.Remove(collectionToEmpty.First());
}

这是EntityCollection<T>所要求的唯一约束,而您在方法正文中没有使用任何需要EntityObject的内容。

顺便问一下,你在这里做的与调用collectionToEmpty.Clear()有什么不同?我暂时没有使用过EF,所以这并不是很明显......