System.Dynamic ошибка? - PullRequest
       16

System.Dynamic ошибка?

9 голосов
/ 12 марта 2010

Пока я играл с динамикой C # 4.0, я обнаружил странные вещи, происходящие с кодом:

using System.Dynamic;

sealed class Foo : DynamicObject
{
    public override bool TryInvoke(
        InvokeBinder binder, object[] args, out object result)
    {
        result = new object();
        return true;
    }

    static void Main()
    {
        dynamic foo = new Foo();

        var t1 = foo(0);
        var t2 = foo(0);
        var t3 = foo(0);
        var t4 = foo(0);
        var t5 = foo(0);
    }
}

Хорошо, это работает, но ... взгляните на окно IntelliTrace:

скриншот http://img717.imageshack.us/img717/4914/10435230.png

Таким образом, каждый вызов (и другие операции с динамическим объектом) приводят к двойному выбрасыванию и отлову странных исключений!

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

Но ... поведение приведенного выше кода выглядит очень странно. Может быть, выбрасывать и перехватывать исключения дважды для любой операции над DynamicObject - это ошибка?

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

Спасибо, я открыл ошибку, мы смотрим на нее. Я обновлю это, как только услышу от команды компиляторов. Он выбрасывает в компоновщик времени выполнения C # (Microsoft.CSharp.dll).

Если вы включите исключения первого шанса в Debug.Exceptions, вы попадете в это. IntelliTrace не имеет ничего общего с ошибкой, он просто показывает вам исключение из первого шанса, которое выдается и проглатывается.

2 голосов
/ 12 марта 2010

Я думаю, что исключения вызваны тем, что отладчик пытается что-то проверить.

Если вы указываете Visual Studio останавливаться всякий раз, когда выдается исключение, оно не останавливается, и это указывает на то, что отладчик отвечает за исключения, а не за фактический код.

...