gpt4 book ai didi

c# - 未调用重载的扩展方法

转载 作者:行者123 更新时间:2023-12-01 19:43:31 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

Could someone explain this behaviour?

当然 - 在编译器找不到要调用的正常实例方法之后,才会考虑扩展方法。他们不属于正常的候选人集。如果您执行的某些操作会导致无法使用普通实例方法进行编译,那么它将会被考虑在内。例如,您可以添加另一个参数,或更改现有方法的参数类型:

public void DoSomething(int foo)

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

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

关于c# - 未调用重载的扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26885423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com