扩展方法冲突
本文关键字:冲突 方法 扩展 | 更新日期: 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>();
这当然是假设items
是SomeClass[]
。