繁体   English   中英

System.Dynamic错误?

[英]System.Dynamic bug?

当我玩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,我们正在看它。 一旦我从编译器团队那里听到,我会更新这个。 它投入了C#运行时绑定程序(Microsoft.CSharp.dll)。

如果在Debug.Exceptions中启用了第一次机会异常,那么你将会遇到这种情况。 IntelliTrace与bug无关,它只是向你展示抛出和吞噬的第一次机会异常。

我认为异常是由调试器试图检查一些东西引起的。

如果告诉Visual Studio在抛出异常时停止它就不会停止,这表明调试器负责异常而不是实际代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM