C# C“扩展法”;超载“;

C# C“扩展法”;超载“;,c#,C#,看看下面的代码 namespace OverLoadTest { class Program { static void Main(string[] args) { ulong value = 10; var foo = new Foo(); foo.DoStuff(value); } } public class Foo {

看看下面的代码

namespace OverLoadTest
{
    class Program
    {
        static void Main(string[] args)
        {
            ulong value = 10;

            var foo = new Foo();
            foo.DoStuff(value);
        }
    }


    public class Foo
    {
        public void DoStuff(float value)
        {
            // This is the resolved overload even if we have an extension method that takes ulong
        }
    }

    public static class FooExtensions
    {
        public static void DoStuff(this Foo foo, ulong value)
        {

        }
    }
}


有人能解释一下为什么在这里不调用使用
ulong
的扩展方法吗?

@RufusL因为它是
Foo
的扩展,它使用
ulong
,而不是
ulong
的扩展。看看一个与接口或类方法具有相同名称和签名的扩展方法,它永远不会被调用。在编译时,扩展方法的优先级总是低于在类型本身中定义的实例方法。另请参阅,它可能比第一个更好,并且支持Pavel的注释。如果隐式转换可以避免使用扩展方法,则它会受到青睐。从ulong到float的隐式转换不能让许多程序员满意,但这就是它的运行方式。@RufusL因为它是
Foo
的扩展,需要
ulong
,不是
ulong的扩展
看看一个扩展方法,它的名称和签名与永远不会调用接口或类方法的名称和签名相同。在编译时,扩展方法的优先级总是低于在类型本身中定义的实例方法。另请参阅,它可能比第一个更好,并且支持Pavel的注释。如果隐式转换可以避免使用扩展方法,则它会受到青睐。从ulong到float的隐式转换不能让许多程序员感到高兴,但这就是它的运行方式。