对C#的扩展方法重载解决方案感到困惑

问题描述 投票:0回答:2

请考虑以下代码:

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,因此它应该在有效的重载池中。实际上,如果删除扩展名,则会调用正确的框架函数。

For reference

编辑:将它们移动到不同的名称空间将显示相同的问题:

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 + " ");
        }
    }
}

For reference

c# overloading overload-resolution
2个回答
2
投票

因为如埃里克·利珀特所说:


0
投票

尝试System.Linq.Enumerable.Take(source, 5)而不只是Take(source, 5)来强制使用原始的“ Take”功能,或将自己的“ Take”重命名为其他名称“ Takef”,以避免此类问题。

© www.soinside.com 2019 - 2024. All rights reserved.