考虑以下代码:

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>同时实现了ICollectionICollection<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();
            }
        }
    }
}

09-28 01:38