gpt4 book ai didi

.net - C# 中的扩展方法重载,它有效吗?

转载 作者:行者123 更新时间:2023-12-04 13:45:10 25 4
gpt4 key购买 nike

有一个具有方法的类,如下所示:

class Window {
public void Display(Button button) {
// ...
}
}

是否可以用另一个更广泛的方法重载该方法,如下所示:
class WindowExtensions {
public void Display(this Window window, object o) {
Button button = BlahBlah(o);
window.Display(button);
}
}

我尝试时发生的事情是我有无限递归。有没有办法让它发挥作用?我希望只有在无法调用其他方法时才调用扩展方法。

最佳答案

让我们来看看规范。首先,我们必须了解方法调用的规则。粗略地说,您从尝试调用方法的实例所指示的类型开始。您沿着继承链向上寻找可访问的方法。然后执行类型推断和重载解析规则,如果成功则调用该方法。只有当没有找到这样的方法时,您才尝试将该方法作为扩展方法进行处理。所以从第 7.5.5.2 节(扩展方法调用),特别是看到粗体语句:

In a method invocation (§7.5.5.1) of one of the forms

expr.identifier()

expr.identifier(args)

expr.identifier<typeargs>()

expr.identifier<typeargs>(args)

if the normal processing of the invocation finds no applicable methods, an attempt is made to process the construct as an extension method invocation.


除此之外的规则有点复杂,但对于您提供给我们的简单案例,它非常简单。如果没有适用的实例方法,则扩展方法 WindowExtensions.Display(Window, object)将被调用。如果参数为 Window.Display,则实例方法适用。是按钮还是 隐含 可转换到按钮上。否则,将调用扩展方法(因为从 object 派生的所有内容都可以隐式转换为 object )。
因此,除非您遗漏了重要的一点,否则您正在尝试做的事情将会奏效。
因此,请考虑以下示例:
class Button { }
class Window {
public void Display(Button button) {
Console.WriteLine("Window.Button");
}
}

class NotAButtonButCanBeCastedToAButton {
public static implicit operator Button(
NotAButtonButCanBeCastedToAButton nab
) {
return new Button();
}
}

class NotAButtonButMustBeCastedToAButton {
public static explicit operator Button(
NotAButtonButMustBeCastedToAButton nab
) {
return new Button();
}
}

static class WindowExtensions {
public static void Display(this Window window, object o) {
Console.WriteLine("WindowExtensions.Button: {0}", o.ToString());
Button button = BlahBlah(o);
window.Display(button);
}
public static Button BlahBlah(object o) {
return new Button();
}
}

class Program {
static void Main(string[] args) {
Window w = new Window();
object o = new object();
w.Display(o); // extension
int i = 17;
w.Display(i); // extension
string s = "Hello, world!";
w.Display(s); // extension
Button b = new Button();
w.Display(b); // instance
var nab = new NotAButtonButCanBeCastedToAButton();
w.Display(b); // implicit cast so instance
var nabexplict = new NotAButtonButMustBeCastedToAButton();
w.Display(nabexplict); // only explicit cast so extension
w.Display((Button)nabexplict); // explictly casted so instance
}
}
这将打印
WindowExtensions.Button: System.Object
Window.Button
WindowExtensions.Button: 17
Window.Button
WindowExtensions.Button: Hello, world!
Window.Button
Window.Button
Window.Button
WindowExtensions.Button: NotAButtonButMustBeCastedToAButton
Window.Button
Window.Button
在控制台上。

关于.net - C# 中的扩展方法重载,它有效吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2118064/

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