В то время как я играющий с динамичным 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 - являются ошибкой?
Спасибо, я обнаружил ошибку, мы ее ищем. Я обновлю это, как только получу от команды компилятора. Он добавляет связыватель времени выполнения C # (Microsoft.CSharp.dll).
Если вы включите исключения первого шанса в Debug.Exceptions, вы попадете в это. IntelliTrace не имеет ничего общего с ошибкой, он просто показывает вам, какое исключение при первой возможности было выброшено и проглочено.
Я думаю, что исключения вызваны тем, что отладчик пытается что-то проверить.
Если вы говорите Visual Studio останавливаться при возникновении исключения, оно не останавливается, и это указывает на то, что за исключения отвечает отладчик, а не сам код.