Я бы не сказал, что C # - это динамический язык первого класса, нет.
Во-первых, некоторые функции статической типизации действительно плохо работают с динамической типизацией. Например:
public void ShowListCount(IList foo)
{
dynamic d = foo;
Console.WriteLine(d.Count);
}
Похоже, это всегда должно работать, потому что IList
выставляет Count
, верно? Попробуйте это с этим:
ShowListCount(new int[10]);
Взрыва. Массивы реализуют IList.Count
с явной реализацией интерфейса, поэтому при динамической типизации «видит» объект как массив, он не выглядит, видя свойство Count
. Существуют различные подобные ошибки.
Кроме того, если вы хотите реализовать динамическое поведение в C # (то есть вызываться динамически), явной поддержки языка нет. Вы можете извлечь из DynamicObject
или реализовать IDynamicMetaObjectProvider
самостоятельно, но ничто в языке не поможет вам.
Я считаю динамическую типизацию в C # чем-то, что следует использовать в первую очередь, когда вы хотите взаимодействовать с существующей динамической платформой, такой как IronPython или COM-интерфейс со слабой типизацией. Есть несколько мест, где это может быть полезно в чистом C #, но они относительно редки.
По сути, C # по-прежнему совершенно очевидно является языком, разработанным с учетом статической типизации. Иметь возможность аккуратно использовать динамическую типизацию там, где вы хотите, это хорошо, но если вы хотите широко использовать динамическую типизацию для одной области вашей кодовой базы, я бы предложил написать этот бит в IronPython, а затем вызывать его из C #.