以下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
答案 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,所以这并不是很明显......