Почему dynamic.ToString () возвращает что-то между строкой, а не строкой?

Я использую тип, полученный изDynamicObject как строитель для некоторых строк. В конце я звонюToString чтобы получить окончательный результат.

В этот момент я думал, что это даст мне нормальную строку, но эта строка как-то странно. Он ведет себя как один, когда я использую строковые функции, но ведет себя так, как будто я не знаю, что, что-то, ни строка, ни динамика.

Вот как я реализовалToString на моего строителя

public class Example : DynamicObject
{
    public override bool TryConvert(ConvertBinder binder, out object result)
    {
        if (binder.ReturnType == typeof(string))
        {
            result = ToString();
            return true;
        }
        result = null;
        return false;
    }   

    public override string ToString()
    {
        return base.ToString();
    }
}

Когда я запускаю это так

dynamic example = new Example();
Console.WriteLine(example.ToString().ToUpper());

результат верный:USERQUERY+EXAMPLE (при исполнении в LINQPad)

Однако, если я назову вторую строку, как это

Console.WriteLine(example.ToString().Extension());

где

static class Extensions
{
    public static string Extension(this string str)
    {
        return str.ToUpper();
    }
}

приложение вылетает сRuntimeBinderException поговорка

'string' не содержит определения для 'Extension'

но если я приведу результат, он снова работает

Console.WriteLine(((string)example.ToString()).Extension());

Может быть, еще один пример.

Console.WriteLine((string)example); // UserQuery+Example

но

Console.WriteLine(example); // DynamicObject UserQuery+Example 

На самом деле вы никогда не сможете быть уверенными в том, что получите, пока не приведете его в строку.

Почему это происходит и есть ли способ избежать дополнительного броска и получить как-тореальный строка?

Ответы на вопрос(1)

Ваш ответ на вопрос