【发布时间】:2013-09-08 19:03:14
【问题描述】:
我想为 ICollection 和 IReadonlyCollection 接口编写一个扩展方法(例如.IsEmpty()):
public static bool IsEmpty<T>(this IReadOnlyCollection<T> collection)
{
return collection == null || collection.Count == 0;
}
public static bool IsEmpty<T>(this ICollection<T> collection)
{
return collection == null || collection.Count == 0;
}
但是当我将它与实现两个接口的类一起使用时,我显然得到了“模糊调用”。
我不想输入myList.IsEmpty<IReadOnlyCollection<myType>>(),我希望它只是myList.IsEmpty()。
这可能吗?
【问题讨论】:
-
您不能为
IEnumerable<T>设置一种方法吗?顺便说一句。在同一个类中同时实现ICollection<T>和IReadOnlyCollection<T>似乎有点奇怪。 -
许多标准类都实现了它们。例如。
List<T>、Dictionary<T>等 -
要么给它们起不同的名字,要么把它们放在不同命名空间的不同静态类中。
-
@mikez 但你不应该这样做。欢迎使用鸭子打字和 MS 错误地没有
ICollection<T>实现IReadOnlyCollection<T>而事实上List<T>implements bothIList<T>andIReadOnlyList<T>implies that it should。 -
@Stijn 我知道这是必要的,因为存在向后兼容性问题。但请注意,您链接的答案中的“原因 #2”是只读意味着不可变的错误误解。我可能会说 MS 错了,因为他们在想到
IReadOnlyCollection<T>之前就发送了ICollection<T>。如果 .net 重新开始并且没有向后兼容性问题,我敢肯定他们会毫不犹豫地将ICollection<T>设为IReadOnlyCollection<T>。我也不确定您是否可以说接口继承,因为成员与父级保持一致。
标签: c# icollection