【发布时间】:2011-01-26 17:41:06
【问题描述】:
当我使用 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 窗口:
screenshot http://img717.imageshack.us/img717/4914/10435230.png
所以每次调用(以及对动态对象的其他操作)都会导致两次抛出和捕获奇怪的异常!
我知道,有时异常机制可能会用于优化,例如对动态的第一次调用可能会被执行到一些存根委托,它只是抛出异常——这可能就像一个信号给动态绑定器以解析正确的成员和重点委托。对同一委托的下一次调用将在没有任何检查的情况下执行。
但是...上面代码的行为看起来很奇怪。每次对 DynamicObject 的任何操作都可能抛出和捕获异常两次 - 是一个错误吗?
【问题讨论】:
-
奇怪,对我来说一切都很好...重新上传到 imageshack,谢谢