受这个问题的启发,我在 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
为,比如说,字符串,一切都会好起来的。
这是为什么?这里有什么规则?是否可以调用静态方法?
也许这是一个 Mono DLR 问题?
编辑:为了澄清。我想知道什么规则将对静态方法的显式调用(至少我认为它是显式的)转换为对非静态方法的调用?从静态上下文来看,这显然是不可能的。
或者,如果没有这样的规则,它会是一个错误吗?可以以某种方式避免这种行为吗?