【发布时间】:2012-10-02 07:17:19
【问题描述】:
以下代码有一个静态方法Foo(),调用一个实例方法Bar():
public sealed class Example
{
int count;
public static void Foo( dynamic x )
{
Bar(x);
}
void Bar( dynamic x )
{
count++;
}
}
它编译时没有错误*,但在运行时会生成运行时绑定器异常。正如预期的那样,删除这些方法的动态参数会导致编译器错误。
那么为什么有一个动态参数可以编译代码呢? ReSharper 也不会将其显示为错误。
编辑 1: *在 Visual Studio 2008 中
编辑 2: 添加了 sealed,因为子类可能包含静态 Bar(...) 方法。当实例方法以外的任何方法都无法在运行时调用时,即使是密封版本也可以编译。
【问题讨论】:
-
+1 提出非常好的问题
-
这是一个 Eric-Lippert 问题。
-
我很确定 Jon Skeet 也会知道如何处理这个问题;)@OlivierJacot-Descombes
-
@Olivier,Jon Skeet 可能想要编译代码,所以编译器允许它:-))
-
这是另一个例子,说明为什么你不应该使用
dynamic,除非你真的需要。
标签: c# visual-studio-2008 dynamic compiler-errors