2010-03-12 27 views
9

Trong khi tôi chơi với C# 4.0 năng động, tôi thấy những điều kỳ lạ xảy ra với mã như thế này:System.Dynamic bug?

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); 
    } 
} 

Ok, nó hoạt động nhưng ... hãy nhìn vào IntelliTrace cửa sổ:

screenshot http://img717.imageshack.us/img717/4914/10435230.png

Vì vậy, mọi sự xâm nhập (và các hoạt động khác nữa đối với đối tượng động) khiến cho việc ném và bắt các ngoại lệ lạ hai lần! Tôi hiểu rằng cơ chế ngoại lệ đôi khi có thể được sử dụng để tối ưu hóa, ví dụ như cuộc gọi đầu tiên đến động có thể được thực hiện cho một số đại biểu sơ khai, chỉ đơn giản là ném ngoại lệ - điều này có thể giống như tín hiệu cho chất kết dính động để giải quyết một thành viên chính xác và ủy nhiệm lại điểm. Cuộc gọi tiếp theo tới cùng một đại biểu sẽ được thực hiện mà không cần bất kỳ séc nào.

Nhưng ... hành vi của mã ở trên trông rất lạ. Có thể ném và bắt ngoại lệ hai lần cho mỗi hoạt động trên DynamicObject - là một lỗi?

+0

ảnh chụp màn hình bị mất;) – TomTom

+0

lạ, tất cả là tốt cho tôi ... tái tải lên imageshack, thx – ControlFlow

Trả lời

3

Cảm ơn, tôi đã mở một lỗi, chúng tôi đang xem xét lỗi đó. Tôi sẽ cập nhật điều này khi tôi nghe từ nhóm Compiler. Nó đang ném trong trình kết nối thời gian chạy C# (Microsoft.CSharp.dll).

Nếu bạn bật ngoại lệ cơ hội đầu tiên trong Debug.Exceptions, bạn sẽ nhấn nút này. IntelliTrace không liên quan gì đến lỗi này, nó chỉ cho bạn thấy ngoại lệ cơ hội đầu tiên bị ném và nuốt.

+0

Cảm ơn Kirill! Không biết về ngoại lệ cơ hội đầu tiên ... – ControlFlow

+1

http://blogs.msdn.com/kirillosenkov/archive/2008/12/07/how-to-debug-crashes-and-hangs.aspx :) –

2

Tôi nghĩ rằng các ngoại lệ là do trình gỡ lỗi cố gắng kiểm tra quá mức.

Nếu bạn yêu cầu Visual Studio dừng bất cứ khi nào ngoại lệ được ném, nó sẽ không dừng lại và điều này cho biết trình gỡ rối chịu trách nhiệm về các ngoại lệ không phải mã thực.

+0

Có vẻ bạn nói đúng, Arve! Tôi đã khởi chạy PerformanceMonitor để kiểm tra số lượng ngoại lệ Thrown và chạy chương trình trong bản phát hành mà không có trình gỡ rối - không có ngoại lệ ... – ControlFlow

+0

Chỉ cho phép ngoại lệ đầu tiên trong Debug -> Exceptions (Ctrl + D, E) và kiểm tra tất cả các hộp kiểm. Bạn sẽ nhấn này. –

0

Lỗi tương tự với động, nhưng nó gây ra lỗi thời gian chạy trong bộ điều khiển MVC 5. Nó apperrs khi tôi thêm một phương pháp làm việc với các bộ sưu tập chung chung, mặc dù phương pháp này không được gọi và không referensed bất cứ nơi nào

[NullReferenceException] at 
Microsoft.CSharp.RuntimeBinder.SymbolTable.GetOriginalTypeParameterType(Type t) +10 
Microsoft.CSharp.RuntimeBinder.SymbolTable.AreTypeParametersEquivalent(Type t1, Type t2) +941668 
Microsoft.CSharp.RuntimeBinder.SymbolTable.LoadMethodTypeParameter(MethodSymbol parent, Type t) +60 
Microsoft.CSharp.RuntimeBinder.SymbolTable.LoadSymbolsFromType(Type originalType) +639 
    Microsoft.CSharp.RuntimeBinder.SymbolTable.GetConstructedType(Type type, AggregateSymbol agg) +112 
Microsoft.CSharp.RuntimeBinder.SymbolTable.LoadSymbolsFromType(Type originalType) +426 
Microsoft.CSharp.RuntimeBinder.SymbolTable.AddMethodToSymbolTable(MemberInfo member, AggregateSymbol callingAggregate, MethodKindEnum kind) +540 
Microsoft.CSharp.RuntimeBinder.SymbolTable.AddNamesInInheritanceHierarchy(String name, BindingFlags flags, List`1 inheritance) +621 
Microsoft.CSharp.RuntimeBinder.SymbolTable.PopulateSymbolTableWithName(String name, IEnumerable`1 typeArguments, Type callingType) +194 
Microsoft.CSharp.RuntimeBinder.RuntimeBinder.PopulateSymbolTableWithPayloadInformation(DynamicMetaObjectBinder payload, Type callingType, ArgumentObject[] arguments) +456 
Microsoft.CSharp.RuntimeBinder.RuntimeBinder.BindCore(DynamicMetaObjectBinder payload, IEnumerable`1 parameters, DynamicMetaObject[] args, DynamicMetaObject& deferredBinding) +98 
Microsoft.CSharp.RuntimeBinder.RuntimeBinder.Bind(DynamicMetaObjectBinder payload, IEnumerable`1 parameters, DynamicMetaObject[] args, DynamicMetaObject& deferredBinding) +74 
Microsoft.CSharp.RuntimeBinder.BinderHelper.Bind(DynamicMetaObjectBinder action, RuntimeBinder binder, IEnumerable`1 args, IEnumerable`1 arginfos, DynamicMetaObject onBindingError) +770   
Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder.FallbackInvokeMember(DynamicMetaObject target, DynamicMetaObject[] args, DynamicMetaObject errorSuggestion) +80 
System.Dynamic.DynamicMetaObject.BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args) +31 
System.Dynamic.InvokeMemberBinder.Bind(DynamicMetaObject target, DynamicMetaObject[] args) +53 
System.Dynamic.DynamicMetaObjectBinder.Bind(Object[] args, ReadOnlyCollection`1 parameters, LabelTarget returnLabel) +224 
System.Runtime.CompilerServices.CallSiteBinder.BindCore(CallSite`1 site, Object[] args) +127 
System.Dynamic.UpdateDelegates.UpdateAndExecute3(CallSite site, T0 arg0, T1 arg1, T2 arg2) +686 
Các vấn đề liên quan