Вызов RequiresString
содержит dynamic
аргументов, поэтому он разрешается во время выполнения с использованием фактического типа аргумента.Фактический тип, возвращаемый DoSomething
, равен string
, поэтому средство связывания во время выполнения ищет RequiresString(string)
, которое может быть успешно найдено как TestClass.RequiresString
.Пока все хорошо.
Следующий вызов testObj.ToJsonTest()
завершается неудачно, как вы уже упоминали, потому что методы расширения для dynamic
target не разрешены , поэтому следующий вызов завершится неудачей.
Да, это может показаться немного грязным, потому что нет (почти) никаких проверок во время компиляции, когда задействованы dynamic
s, очень похоже на слабо типизированные языки сценариев.Вот почему я бы посоветовал использовать dynamic
, только если это действительно необходимо и в самом узком контексте;в частности, я бы сказал, что dynamic
не должно быть видно на публичной поверхности класса.