[英]Confused about C#'s extension method overload resolution
考慮以下代碼:
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
包含在內,因此它應該在有效重載池中。 事實上,如果我刪除我的擴展,就會調用正確的框架 function。
編輯:將它們移動到不同的名稱空間顯示相同的問題:
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” function 或將您自己的“Take”重命名為其他“Takef”,例如以避免這種情況的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.