Пока я играл с динамикой 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 - это ошибка?