C # динамический тип получил

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

Следующая программа компилируется нормально, но при ее запуске вы получаетеRuntimeBinderException когда ты пытаешься читать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?
    }
}

Вот умопомрачительная часть. Переместить вложенный типFactory+Empty внеFactory класс, вот так:

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

class Factory...

И программа работает нормально, кто-нибудь хочет объяснить, почему это так?

РЕДАКТИРОВАТЬ

В моем приключении кодирования я, конечно, сделал то, о чем должен был подумать первым. Вот почему вы видите, что я немного рассуждаю о разнице между частным и внутренним классом. Это было потому, что я установилInternalsVisibleToAttribute что заставило мой тестовый проект (который в этом случае потреблял биты) вести себя так, как они это делали, и все это было задумано, хотя и намекало на меня с самого начала.

Прочитайте ответ Эрика Липперта для хорошего объяснения всего остального.

Что меня по-настоящему насторожило, так это то, что динамическое связующее устройство учитывает тип экземпляра. У меня большой опыт работы с JavaScript, и как программист на JavaScript, где действительно нет такой вещи, как публичная или приватная, я был полностью одурачен тем фактом, что видимость имела значение, я имею в виду, в конце концов, я получал доступ к этому члену, как будто это был общедоступный тип интерфейса (я думал, что динамический был просто синтаксическим сахаром для размышлений), но динамическое связующее не может сделать такое предположение, если вы не дадите ему подсказку, используя простое приведение.

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

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