考虑以下两个扩展方法:
using System;
using System.Collections.Generic;
using System.Linq;
public static class Extensions
{
public static bool Contains(this IEnumerable self, object obj)
{
foreach (object o in self)
{
if (Object.Equals(o, obj))
{
return true;
}
}
return false;
}
public static bool ContainsEither<T>(this IEnumerable<T> self, T arg1, T arg2)
{
return self.Contains(arg1) || self.Contains(arg2);
}
}
当我写了第二个方法时,我的意图是调用通用的LINQ
Enumerable.Contains<T>
方法(类型参数从使用中推断)。然而,我发现它实际上调用了第一个方法(我的自定义Contains()
扩展方法)。当我注释掉我的Contains()
方法时,第二个方法编译良好,使用Enumerable.Contains<T>()
方法。我的问题是,为什么编译器会选择带有非泛型
IEnumerable
参数的Contains()
方法,而不是带有IEnumerable<T>
参数的Enumerable.Contains<T>()
方法?我希望它选择Enumerable.Contains<T>()
,因为IEnumerable<T>
比IEnumerable
更派生。