2011-08-17 10 views
7

W poniższym kodzie:Dlaczego debugger programu Visual Studio nie może poprawnie oceniać wyrażeń zawierających typowe argumenty typu?

 private static void Main(string[] args) 
     {    
      var listy = new List<DateTime> { DateTime.Now }; 
      MyMethod(listy); 
     } 

     static void MyMethod<T>(List<T> myList) 
     { 
      // put breakpoint here 
     } 

Jeśli złamię w debugger, otwartą QuickWatch na "myList", widzę:

myList 
    [0] 
    Raw View 

Gdybym wybierz "[0]" węzeł i kliknij Dodaj Watch, ekspresji, która jest dodawana do Watch:

(new System.Collections.Generic.Mscorlib_CollectionDebugView<System.DateTime>(myList)).Items[0]

wyrażenie to wydaje się słuszne, a jednak, okno zegarek pokazuje th e następujący błąd:

The best overloaded method match for 'System.Collections.Generic.Mscorlib_CollectionDebugView.Mscorlib_CollectionDebugView(System.Collections.Generic.ICollection)' has some invalid arguments

To wygląda na błąd w debugerze. Dlaczego to się dzieje? I czy jest to udokumentowane w dowolnym miejscu?

+0

Ma problemy z myList w jakiś sposób działa, jeśli używasz zmiennej statycznej. Opublikuj na connect.microsoft.com –

+0

Microsoft [oznaczono raport o błędzie, który zgłosiłem jako Naprawiono] (https://connect.microsoft.com/VisualStudio/feedback/details/684678/visual-studio-debugger-c-expression-evaluator- doesnt-work-with-bound-generic-types), więc mam nadzieję, że tak się nie stanie w dev11. –

Odpowiedz

1

To wygląda jak błąd w rozdzielczości przeciążenie logiki C# 's ekspresji oceniającego. Kombinacja wywoływania generycznego konstruktora typów i przekazywania związanego standardu wydaje się być kluczem. Usunięcie jednego z nich wydaje się naprawić problem. Na przykład można wywołać ekspresję wymienionego jawnie odlewania myList do ICollection<DateTime> (to nie rozwiąże wszystkich przypadków próbowałem choć)

Oto przykładowy program napisałem do zawężenia problemu

class C<T> { 
    public C(ICollection<T> collection) { 

    } 
} 

static void Example<T>(ICollection<T> collection) { 
} 

Na sama przerwa można wypróbować następujące oceny

  • Example(myList) - działa bez błędu
  • new C<DateTime>(myList) - zakończy się s ame błąd

W tym momencie myślę, że powinieneś zgłosić błąd na Connect. To na pewno błąd (podobny kod działa dobrze w VB.Net)

+0

Dziękujemy! Otworzyłem bilet connect @ https://connect.microsoft.com/VisualStudio/feedback/details/684678/visual-studio-debugger-c-expression-evaluator-doesnt-work-with-bound-generic-types. Sądzę, że zawsze będę korzystał z obejścia i mam nadzieję na najlepsze. –

0

Wygląda w ten sposób. Byłem w stanie powtórzyć błąd. Mscorlib_CollectionDebugView<T> ma tylko jeden konstruktor akceptujący ICollection<T> i List<T> implementuje narzędzia ICollection<T>. Również wyraźnie odlewania do ICollection<T> prac:

(new System.Collections.Generic.Mscorlib_CollectionDebugView<System.DateTime>((ICollection<DateTime>)myList)).Items[0] 
+0

Dzięki. Też znalazłem to obejście. Ale jestem bardziej zaniepokojony, dlaczego tak się dzieje, aby móc zrozumieć, czy to obejście zawsze ma zastosowanie (jestem autorem rozszerzenia Visual Studio, które ma do czynienia z debugowaniem, więc ważne jest dla mnie zrozumienie głównej przyczyny) –

Powiązane problemy