con*_*low 9 .net c# dynamic c#-4.0
当我玩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);
}
}
Run Code Online (Sandbox Code Playgroud)
好的,它可以工作但是......看看IntelliTrace窗口:
截图http://img717.imageshack.us/img717/4914/10435230.png
因此,每次调用(以及动态对象上的其他操作)都会导致抛出和捕获奇怪的异常两次!
我理解,有时可以使用异常机制进行优化,例如,可以对某个存根委托执行对动态的第一次调用,这只会抛出异常 - 这可能就像是动态绑定器的信号来解析正确的成员并重新指向代表.下一次对同一代表的调用将在没有任何检查的情况下执行.
但是......上面代码的行为看起来很奇怪.也许每次对DynamicObject进行两次抛出和捕获异常 - 是一个错误?
谢谢,我已经打开了一个错误,我们正在查看它。一旦收到编译器团队的消息,我将更新此内容。它抛出了 C# 运行时绑定程序 (Microsoft.CSharp.dll)。
如果您在 Debug.Exceptions 中启用首次机会异常,您将遇到此问题。IntelliTrace 与该错误无关,它只是向您展示抛出和吞没的第一次机会异常。
| 归档时间: |
|
| 查看次数: |
942 次 |
| 最近记录: |