当我使用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 上的每个操作都引发并捕获异常两次 - 是一个 bug 吗?