C # dynamischer Typ gotcha

Ich bin nur auf das Seltsamste gestoßen und bin ein bisschenGeist = geblasen im Moment...

Das folgende Programm kompiliert gut, aber wenn Sie es ausführen, erhalten Sie eineRuntimeBinderException wenn Sie versuchen zu lesenValue. '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?
    }
}

Hier ist der überwältigende Teil. Verschieben Sie den verschachtelten TypFactory+Empty außerhalb derFactory Klasse, wie so:

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

class Factory...

Und das Programm läuft einwandfrei, will jemand erklären, warum das so ist?

BEARBEITEN

In meinem Abenteuer des Codierens tat ich natürlich etwas, woran ich zuerst hätte denken sollen. Deshalb sehe ich mich ein bisschen über den Unterschied zwischen privat und intern unterhalten. Das lag daran, dass ich das eingestellt hatteInternalsVisibleToAttribute Dadurch hat sich mein Testprojekt (das in diesem Fall die Bits verbraucht hat) so verhalten, wie es getan wurde. Das war alles beabsichtigt, obwohl es mich von Anfang an anspielte.

Lesen Sie die Antwort von Eric Lippert, um eine gute Erklärung für den Rest zu erhalten.

Was mich sehr gefesselt hat, war, dass der dynamische Ordner die Sichtbarkeit des Instanztyps berücksichtigt. Ich habe viel Erfahrung mit JavaScript, und als JavaScript-Programmierer, bei dem es weder öffentlich noch privat gibt, habe ich mich völlig getäuscht, dass die Sichtbarkeit eine Rolle spielt. Ich meine, ich habe auf dieses Mitglied zugegriffen, als ob Es war vom Typ einer öffentlichen Schnittstelle (ich dachte, Dynamik sei einfach syntaktischer Zucker zum Nachdenken), aber der dynamische Ordner kann eine solche Annahme nur dann treffen, wenn Sie ihr mithilfe einer einfachen Besetzung einen Hinweis geben.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage