扩展方法冲突
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>();
这当然是假设 items
是 SomeClass[]
。
我有两种接口扩展方法,一种对实现接口的 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>();
这当然是假设 items
是 SomeClass[]
。