请考虑以下代码:
using System;
using System.Linq;
using System.Collections.Generic;
public static class Ex
{
public static IEnumerable<T> Take<T>(this IEnumerable<T> source, long cnt)
{
return source;
}
}
public class C
{
public static void Main()
{
foreach(var e in Enumerable.Range(0, 10).Take(5).ToArray())
Console.Write(e + " ");
}
}
我在IEnumerable<T>
上有一个Take(long)
扩展名,框架未提供。该框架仅提供Take(int)
。而且由于我使用int
参数(Take(5)
)进行调用,因此我希望它使用框架版本,但它正在调用我的扩展名。
我想念什么吗?最接近的匹配显然是将int
作为参数的匹配,并且包含了System.Linq
,因此它应该在有效的重载池中。实际上,如果删除扩展名,则会调用正确的框架函数。
编辑:将它们移动到不同的名称空间将显示相同的问题:
using System;
using System.Linq;
using System.Collections.Generic;
namespace N1
{
public static class Ex
{
public static IEnumerable<T> Take<T>(this IEnumerable<T> source, long cnt)
{
return source;
}
}
}
namespace N2
{
using N1;
public class C
{
public static void Main()
{
foreach(var e in Enumerable.Range(0, 10).Take(5).ToArray())
Console.Write(e + " ");
}
}
}
因为如埃里克·利珀特所说:
尝试System.Linq.Enumerable.Take(source, 5)
而不只是Take(source, 5)
来强制使用原始的“ Take”功能,或将自己的“ Take”重命名为其他名称“ Takef”,以避免此类问题。