System.Dynamic有bug吗?

9

当我使用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 吗?


奇怪,对我来说一切都很好...重新上传到imageshack,谢谢。 - controlflow
2个回答

3

谢谢,我已经提交了一个bug,我们正在查看。一旦我从编译器团队听到回复,我会更新这个bug。它会在C#运行时绑定器(Microsoft.CSharp.dll)中抛出异常。

如果您在Debug.Exceptions中启用首次机会异常,您将遇到此问题。 IntelliTrace与该错误无关,它只是显示第一次机会异常被抛出和忽略。


1
请参考以下链接:http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx - Kirill Osenkov

2

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

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


看来你是对的,Arve!我已经启动了PerformanceMonitor来检查抛出异常的计数,并在没有调试器的情况下以发布版本运行程序 - 没有抛出任何异常... - controlflow
只需在“调试”->“异常”(Ctrl + D,E)中启用“第一次机会异常”,并选中所有复选框。您将遇到此问题。 - Kirill Osenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接