System.Dynamic bug?
Enquanto brincava com a dinâmica do C # 4.0, descobri coisas estranhas acontecendo com o código assim:
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);
}
}
Ok, funciona, mas ... dê uma olhada na janela do IntelliTrace:
captura de tela http://img717.imageshack.us/img717/4914/10435230.png
Portanto, toda invocação (e outras operações também em objetos dinâmicos) causa lançamentos e capturas de exceções estranhas duas vezes!
Entendo que, às vezes, o mecanismo de exceções pode ser usado para otimizações, por exemplo, a primeira chamada para dinâmica pode ser realizada para algum delegado de stub, que simplesmente gera exceção - isso pode ser como um sinal para o fichário dinâmico para resolver um membro correto e apontar novamente delegar. A próxima chamada para o mesmo delegado será realizada sem nenhuma verificação.
Mas ... o comportamento do código acima parece muito estranho. Talvez lançar e capturar exceções duas vezes por qualquer operação no DynamicObject - é um erro?