如果我们有一个像这样的简单类:
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");
输出是"我是一个对象:一些文字"
有人可以解释这种行为吗?
我想这与分配方法的时间有关,但我在这里遗漏了一些东西。我将不胜感激任何澄清。感谢
答案 0 :(得分:5)
有人可以解释这种行为吗?
确定 - 在之后编译器未能找到正常的实例方法来调用时,不考虑扩展方法。他们不属于正常候选人集。如果你做的事情会使用普通的实例方法无法编译,那么将考虑在内。例如,您可以添加另一个参数,或更改现有方法的参数类型:
public void DoSomething(int foo)
甚至可以使用命名参数来调用它,使其仅与扩展方法匹配:
myClass.DoSomething(aStr: "some text");