В следующем коде есть статический метод 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(...). Даже закрытая версия компилируется, когда невозможно, чтобы во время выполнения можно было вызвать любой метод, отличный от метода экземпляра.