扩展方法冲突

Extension Method Collision

我有两种接口扩展方法,一种对实现接口的 class 实例执行操作,另一种对实现接口的 classes 集合执行操作。问题是编译器总是使用第一个扩展方法,这会产生编译错误,所以我不能使用集合版本。

public interface ISomeInterface
{
}

public class SomeClass : ISomeInterface
{
}

public static class SomeClassExtensions
{
    public static T DoSomething<T>(this T item) where T : class, ISomeInterface
    {
        return item;
    }

    public static IEnumerable<T> DoSomething<T>(this IEnumerable<T> items) where T : class, ISomeInterface
    {
        return items;
    }
}

internal class Program
{
    private static void Main()
    {
        var items = new[]
        {
            new SomeClass()
        };

        items.DoSomething(); // compiler error
    }
}

错误很明显,编译器正在尝试使用第一种扩展方法:

The type 'ConsoleApplication1.SomeClass[]' cannot be used as type parameter 'T' in the generic type or method 'SomeClassExtensions.DoSomething(T)'. There is no implicit reference conversion from 'ConsoleApplication1.SomeClass[]' to 'ConsoleApplication1.ISomeInterface'.

很明显,我可以重命名这两种扩展方法中的一种,但这是最后的手段,因为这是针对开源项目的,我试图避免偏离既定的命名约定集。

我不知道如何强制执行我需要的工作,也许有一种方法可以添加或调整泛型类型约束?

应该这样做

var items = new[]
{
    new SomeClass()
};

items.DoSomething<SomeClass>();

这当然是假设 itemsSomeClass[]