Рассмотрим следующий код:
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 + " ");
}
}
}
Для справки