¿Por qué dynamic.ToString () devuelve algo entre una cadena y no una cadena?

Yo uso un tipo derivado de unDynamicObject como constructor de algunas cadenas. Al final llamoToString para obtener el resultado final

En este punto, pensé que me daría una cadena normal, pero esta cadena es de alguna manera extraña. Se comporta como uno cuando uso funciones de cadena, pero se comporta como si no supiera qué, algo que no sea una cadena ni una dinámica.

Así es como implementéToString en mi constructor

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();
    }
}

Cuando lo corro así

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

El resultado es correcto:USERQUERY+EXAMPLE (cuando se ejecuta en LINQPad)

Sin embargo, si llamo a la segunda línea así

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

dónde

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

la aplicación se bloquea con unRuntimeBinderException diciendo

'string' no contiene una definición para 'Extension'

pero si lanzo el resultado funciona de nuevo

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

Quizás un ejemplo más.

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

pero

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

En realidad, nunca puede estar seguro de lo que obtendrá hasta que lo convierta en cadena.

¿Por qué sucede esto? ¿Hay alguna forma de evitar el reparto adicional y obtener de alguna manerareal ¿cuerda?

Respuestas a la pregunta(1)

Su respuesta a la pregunta