Я бы не сказал, что 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 API со слабой типизацией. Есть некоторые места, где это может быть полезно в чистом C#, но они относительно редки.
По сути, C# по-прежнему явно является языком, разработанным с учетом статической типизации. Хорошо иметь возможность осторожно использовать динамическую типизацию там, где вы хотите, но если вы хотите широко использовать динамическую типизацию для одной области вашей кодовой базы, я бы предложил написать этот бит на IronPython, а затем вызвать его из C#.
person
Jon Skeet
schedule
25.03.2010