Gotcha typu dynamicznego C #

Po prostu wpadłem na najdziwniejszą rzecz i jestem trochęmind = blown w tym momencie...

Poniższy program dobrze się kompiluje, ale gdy go uruchomisz, otrzymaszRuntimeBinderException kiedy próbujesz czytaćValue. 'object' does not contain a definition for 'Value'

class Program
{
    interface IContainer
    {
        int Value { get; }
    }

    class Factory
    {
        class Empty : IContainer
        {
            public int Value
            {
                get { return 0; }
            }
        }

        static IContainer nullObj = new Empty();

        public IContainer GetContainer()
        {
            return nullObj;
        }
    }

    static void Main(string[] args)
    {
        dynamic factory = new Factory();
        dynamic container = factory.GetContainer();
        var num0 = container.Value; // WTF!? RuntimeBinderException, really?
    }
}

Oto część umysłu. Przenieś zagnieżdżony typFactory+Empty pozaFactory klasa, tak:

class Empty : IContainer
{
    public int Value
    {
        get { return 0; }
    }
}

class Factory...

A program działa dobrze, każdy chce wyjaśnić, dlaczego tak jest?

EDYTOWAĆ

W mojej przygody z kodowaniem zrobiłem oczywiście coś, o czym powinienem był najpierw pomyśleć. Dlatego widzicie, jak trochę się zastanawiam nad różnicą między klasą prywatną a wewnętrzną. To dlatego, że ustawiłemInternalsVisibleToAttribute co sprawiło, że mój projekt testowy (który w tym przypadku pochłaniał bity) zachowywał się tak, jak wyglądał, co było zgodne z założeniami, chociaż od początku mnie nawiązywało.

Przeczytaj odpowiedź Erica Lipperta na dobre wyjaśnienie reszty.

To, co naprawdę mnie przykuło, to fakt, że dynamiczny segregator uwzględnia widoczność typu instancji. Mam dużo doświadczenia w JavaScript i jako programista JavaScript, gdzie naprawdę nie ma czegoś takiego jak publiczne lub prywatne, byłem całkowicie oszukany przez fakt, że widoczność ma znaczenie, w końcu miałem dostęp do tego członka tak, jakby był to typ interfejsu publicznego (myślałem, że dynamika jest po prostu syntaktycznym cukrem do odbicia), ale dynamiczne spoiwo nie może założyć takiego założenia, chyba że dasz mu podpowiedź, używając prostej obsady.

questionAnswers(2)

yourAnswerToTheQuestion