Повышает ли ключевое слово «динамический» и DLR C# как язык первого класса как язык с динамической типизацией?

Я понимаю, что новое ключевое слово dynamic в C# 4.0 облегчает взаимодействие с динамическими языками .NET и может помочь сократить код, используя его вместо отражения. Таким образом, использование для очень конкретных ситуаций.

Однако я хотел бы знать, даст ли это C# все динамические преимущества, которые можно было бы получить в других динамических языках, таких как языки IronXXX? Другими словами, можно ли будет написать все приложение на C# в стиле динамического языка?

И если это возможно, будет ли это рекомендовано или нет. И почему, или почему нет соответственно?

Смогу ли я получить все преимущества динамического языка, не переключаясь на другой язык?


person Jacques Bosch    schedule 25.03.2010    source источник


Ответы (2)


Я бы не сказал, что 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
comment
Спасибо. Очень четкий и информативный ответ. Интересная проблема с явной реализацией интерфейса. - person Jacques Bosch; 25.03.2010

Хотя ключевое слово dynamic определенно приблизит C# к динамическому миру, оно не сделает его динамическим языком и, таким образом, не будет иметь преимуществ динамических языков, таких как добавление методов к существующему типу во время выполнения...

person Darin Dimitrov    schedule 25.03.2010