扩展方法冲突

本文关键字:冲突 方法 扩展 | 更新日期: 2023-09-27 17:56:28

我有两个接口扩展方法,一个对实现接口的类的实例执行操作,另一个对实现接口的类集合执行操作。问题是编译器始终使用第一个扩展方法,这会产生编译错误,因此我无法使用集合版本。

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
    }
}

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

类型"ConsoleApplication1.SomeClass[]"不能用作泛型类型或方法"SomeClassExtensions.DoSomething(T)"中的类型参数"T"。没有从"ConsoleApplication1.SomeClass[]"到"ConsoleApplication1.ISomeInterface"的隐式引用转换。

显然,我可以重命名两种扩展方法之一,但这是最后的手段,因为这适用于开源项目,我试图避免偏离一组既定的命名约定。

我对如何强制我需要工作的想法没有想法,也许有一种方法可以添加或调整泛型类型约束?

扩展方法冲突

这应该可以做到

var items = new[]
{
    new SomeClass()
};
items.DoSomething<SomeClass>();

这当然是假设itemsSomeClass[]