考虑以下代码:
public static class Extensions {
public static bool isEmpty<T>(this ICollection<T> collection) {
return collection.Count == 0;
}
public static bool isEmpty(this ICollection collection) {
return collection.Count == 0;
}
}
public class A {
IList<string> typedList;
IList rawList;
List<string> list;
public void b() {
bool d = typedList.isEmpty();
bool e = rawList.isEmpty();
}
}
上面的代码没问题,对于
IList
实现ICollection
,而IList<T>
实现ICollection<T>
。如果我们删除其中一种扩展方法,则b()
中的其中一行将无法编译。这就是为什么我同时声明了两种扩展方法的原因。但是,如果我们调用list.isEmpty()
:ambiguous call
,就会出现问题。但是,这是因为List<T>
同时实现了ICollection
和ICollection<T>
。如何解决这个问题?当然,我可以添加扩展方法isEmpty(this List<T> list)
,但是,自然地,它不能修复实现了类型化和未类型化接口的任何其他集合(并且对于实现了类型化和未类型化的任何非集合都适用)相同界面的版本)。 最佳答案
您可以简单地为IEnumerable
添加扩展名,该扩展名将适用于所有序列。
public static class Extensions
{
public static bool IsEmpty(this IEnumerable collection)
{
return !collection.Cast<object>().Any();
}
}
要么
public static class Extensions
{
public static bool IsEmpty(this IEnumerable collection)
{
IEnumerator enumerator = null;
try
{
enumerator = collection.GetEnumerator();
return !enumerator.MoveNext();
}
finally
{
IDisposable disposable = enumerator as IDisposable;
if (disposable != null)
{
disposable.Dispose();
}
}
}
}