未调用重载的扩展方法

本文关键字:扩展 方法 重载 调用 | 更新日期: 2023-09-27 18:30:10

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

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

现在我们这样做:

        var myClass = new MyClass();
        myClass.DoSomething("A message");

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

好的。那很好。但是,如果我们有一个扩展方法的"类似"过载,例如:

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

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

        var myClass = new MyClass();
        myClass.DoSomething("some text");

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

有人能解释这种行为吗?。

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

未调用重载的扩展方法

有人能解释这种行为吗?

直到之后编译器未能找到要调用的正常实例方法,才考虑使用Sure-extension方法。它们不是正常候选集合的一部分。如果你做了一些会使它无法用普通实例方法编译的事情,那么它将被考虑在内。例如,您可以添加另一个参数,或者更改现有方法的参数类型:

public void DoSomething(int foo)

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

myClass.DoSomething(aStr: "some text");