未调用重载的扩展方法

oso*_*rio 2 c# extension-methods

如果我们有一个像这样的简单类:

class MyClass
{
    public void DoSomething(object anObj)
    {
        Console.WriteLine("I am an Object: {0}", anObj);
    }

    public void DoSomething(string aStr)
    {
        Console.WriteLine("I am a String: {0}", aStr);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们这样做:

        var myClass = new MyClass();
        myClass.DoSomething("A message");
Run Code Online (Sandbox Code Playgroud)

输出是"我是一个字符串:一些文本"

好.那样就好.但是,如果我们使用扩展方法进行"类似"重载,例如:

class MyClass
{
    public void DoSomething(object anObj)
    {
        Console.WriteLine("I am an Object: {0}", anObj);
    }
}

static class MyClassExtension
{
    public static void DoSomething(this MyClass myClass, string aStr)
    {
        Console.WriteLine("I am a String: {0}", aStr);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们执行与以前相同的代码:

        var myClass = new MyClass();
        myClass.DoSomething("some text");
Run Code Online (Sandbox Code Playgroud)

输出是"我是一个对象:一些文本"

有人可以解释这种行为吗?

我想这与分配方法的时间有关,但我在这里遗漏了一些东西.我将不胜感激任何澄清.谢谢

Jon*_*eet 5

有人可以解释这种行为吗?

确实 - 直到编译器找不到要调用的普通实例方法之后才考虑扩展方法.他们不是正常候选人的一部分.如果你做一些事情,将使其无法与正常的实例方法来编译,那么它被考虑在内.例如,您可以添加另一个参数,或更改现有方法的参数类型:

public void DoSomething(int foo)
Run Code Online (Sandbox Code Playgroud)

或者甚至使用命名参数调用它,使其仅与扩展方法匹配:

myClass.DoSomething(aStr: "some text");
Run Code Online (Sandbox Code Playgroud)