gpt4 book ai didi

c# - 当存在非静态、更适合的方法时,如何使用动态参数调用静态方法?

转载 作者:行者123 更新时间:2023-11-30 12:49:04 25 4
gpt4 key购买 nike

灵感来自 this question我在 Mono 2.10.9 和 Visual Studio 2010 上尝试了以下代码:

public class Example
{
public static void Main()
{
Foo(1);
}

public static void Foo( dynamic x )
{
Example.Bar(x);
}

static void Bar( dynamic x )
{
x++;
}

int count;
void Bar( int x )
{
count++;
}
}

如您所见,Foo 是静态的,因此它只能访问静态的 Bar - 我明确地调用了静态版本!

我知道我无法声明 static void Bar( int x ),因为存在非静态版本。

但是,将非静态 Bar 的参数类型更改为,比方说,字符串,一切都会好起来的。

这是为什么呢?这里的规则是什么?是否可以调用静态方法?

也许是单声道 DLR 问题?

编辑:为了澄清。我想知道什么规则将对静态方法的显式调用(至少我认为它是显式的)转换为对非静态方法的调用?这在静态上下文中显然是不可能的。

或者,如果没有这样的规则,它会不会是一个错误?可以以某种方式避免这种行为吗?

最佳答案

那里的关键陈述是“我知道我无法声明 static void Bar( int x ),因为存在非静态版本。”。使用 dynamic 关键字将重载决议推迟到运行时,但它不会在运行时出现时免除您的规则。

当重载决议最终发生时,DLR 会评估所有可用选项,然后选择最佳选项。在此解决时间之前,动态类型的参数的行为很像对象类型(参见 here )。因此,通常情况下,采用 int 的更具体的方法将成为过载解决方案的赢家,因此被选择为采用动态/对象的方法。这意味着实例方法通常会获胜。 DLR 知 Prop 有相同签名的两个方法不能因静态而异。在评估可用选项时,您期望它做的是说“啊哈!在这种情况下,static void Bar(dynamic x) 可以解释为 static void Bar(int x)”。但是,如果它确实这么说,那么将违反关于没有其他相同的静态和非静态方法的规则。它的内部选项列表将包含静态和非静态 Bar 方法,这两种方法都具有相同的签名。所以不能这么说。这留下了唯一的其他选择,它恰好是一个实例方法。这在这种情况下没有用,因此 DLR 会抛出 RuntimeBinderException。如果您将实例 Bar 的参数更改为 int 以外的参数,则方法签名不会冲突,因此 DLR 可以将静态动态 Bar 解释为采用 int 并改为选择该重载。

关于c# - 当存在非静态、更适合的方法时,如何使用动态参数调用静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12843251/

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