Search code examples
c#extension-methodsicollectionambiguous

ICollection / ICollection<T> ambiguity problem


Just want to make simple extension for syntactic sygar :

public static bool IsNotEmpty(this ICollection obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}

public static bool IsNotEmpty<T>(this ICollection<T> obj)
{
    return ((obj != null)
        && (obj.Count > 0));
}

It works perfectly when I work with some collections, but when working with others I get

The call is ambiguous between the following methods or properties: 'PowerOn.ExtensionsBasic.IsNotEmpty(System.Collections.IList)' and 'PowerOn.ExtensionsBasic.IsNotEmpty(System.Collections.Generic.ICollection)'

Is there any canonical solution to this problem ?

No, I don't want to perform a cast before calling this method ;)


Solution

  • My best way to solve the ambiguity : define an overload for all common non-generic ICollection classes. That means custom ICollection won't be compatible, but it's no big deal as generics are becoming the norme.

    Here is the whole code :

    /// <summary>
    /// Check the given array is empty or not
    /// </summary>
    public static bool IsNotEmpty(this Array obj)
    {
        return ((obj != null)
            && (obj.Length > 0));
    }
    /// <summary>
    /// Check the given ArrayList is empty or not
    /// </summary>
    public static bool IsNotEmpty(this ArrayList obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    /// <summary>
    /// Check the given BitArray is empty or not
    /// </summary>
    public static bool IsNotEmpty(this BitArray obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    /// <summary>
    /// Check the given CollectionBase is empty or not
    /// </summary>
    public static bool IsNotEmpty(this CollectionBase obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    /// <summary>
    /// Check the given DictionaryBase is empty or not
    /// </summary>
    public static bool IsNotEmpty(this DictionaryBase obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    /// <summary>
    /// Check the given Hashtable is empty or not
    /// </summary>
    public static bool IsNotEmpty(this Hashtable obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    /// <summary>
    /// Check the given Queue is empty or not
    /// </summary>
    public static bool IsNotEmpty(this Queue obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    /// <summary>
    /// Check the given ReadOnlyCollectionBase is empty or not
    /// </summary>
    public static bool IsNotEmpty(this ReadOnlyCollectionBase obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    /// <summary>
    /// Check the given SortedList is empty or not
    /// </summary>
    public static bool IsNotEmpty(this SortedList obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    /// <summary>
    /// Check the given Stack is empty or not
    /// </summary>
    public static bool IsNotEmpty(this Stack obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    /// <summary>
    /// Check the given generic is empty or not
    /// </summary>
    public static bool IsNotEmpty<T>(this ICollection<T> obj)
    {
        return ((obj != null)
            && (obj.Count > 0));
    }
    

    Note that I did not want it to work on IEnumerable<T>, because Count() is a method that can trigger a database request if you are working with Linq-to-Entity or Linq-to-SQL.