Während ich mit der C # 4.0-Dynamik spielte, fand ich seltsame Dinge, die mit dem Code passieren:
%Vor%Ok, es funktioniert, aber ... werfen Sie einen Blick auf das IntelliTrace-Fenster:
Screenshot http://img717.imageshack.us/img717/4914/10435230.png
Jedes Aufrufen (und auch andere Operationen auf einem dynamischen Objekt) führt dazu, dass merkwürdige Ausnahmen zweimal geworfen und abgefangen werden!
Ich verstehe, dass manchmal Exception-Mechanismen für Optimierungen verwendet werden können, zum Beispiel kann der erste Aufruf von dynamic an einen Stub-Delegaten ausgeführt werden, der einfach eine Exception auslöst - dies kann wie ein Signal für dynamische Binder sein, um ein korrektes Member aufzulösen Delegate neu zuweisen. Der nächste Aufruf an denselben Delegaten wird ohne Überprüfungen ausgeführt.
Aber ... das Verhalten des obigen Codes sieht sehr seltsam aus. Vielleicht ist das Werfen und Abfangen von Ausnahmen zweimal pro Operation auf DynamicObject - ein Fehler?
Danke, ich habe einen Fehler geöffnet, wir sehen uns das an. Ich werde dies aktualisieren, sobald ich vom Compiler-Team höre. Es wirft den C # -Runtime-Binder (Microsoft.CSharp.dll).
Wenn Sie Ausnahmen der ersten Chance in Debug.Exceptions aktivieren, werden Sie dies treffen. IntelliTrace hat nichts mit dem Fehler zu tun, es zeigt nur die Ausnahme der ersten Chance, die geworfen und verschluckt wird.
Ich denke, die Ausnahmen werden durch den Debugger verursacht, der versucht, etwas zu inspizieren.
Wenn Sie Visual Studio anweisen, jedes Mal anzuhalten, wenn eine Ausnahme ausgelöst wird, hört es nicht auf und dies zeigt an, dass der Debugger für die Ausnahmen verantwortlich ist, nicht für den eigentlichen Code.