2011-08-17 2 views
7

Visual Studio 디버거가 제네릭 형식 인수가 포함 된 식을 제대로 평가하지 않는 이유는 무엇입니까?

다음 코드에서 :

  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 
     } 

"myList"에서 QuickWatch를 열면 다음과 같이 보입니다.

myList 
    [0] 
    Raw View 

"[0]"노드를 선택하고 추가를 클릭하면 watch : Watch에 추가 된 표현식 :

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

이 표현식은 정확하지만 시계 창에 다음 오류가 표시됩니다.

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

이것은 디버거의 버그처럼 보입니다 . 왜 이런 일이 생길까요? 그리고 그것은 어디서나 문서화되어 있습니까?

+0

그것은 myList와 어떻게 든간에 문제가, 당신이 정적 변수를 사용하면 작동합니다. connect.microsoft.com에 게시 –

+0

Microsoft [내가 고정 된 버그 신고서를 작성했습니다] (https://connect.microsoft.com/VisualStudio/feedback/details/684678/visual-studio-debugger-c-expression-evaluator- 바인드되지 않은 제네릭 타입), 잘하면 dev11에서 이런 일이 일어나지 않을 것입니다. –

답변

1

를이는 C#의 식 계산기의 오버로드 확인 로직의 버그처럼 보인다. 제네릭 형식 생성자를 호출하고 바인딩 된 제네릭을 전달하는 조합이 키인 것처럼 보입니다. 이 중 하나를 제거하면 문제가 해결되는 것 같습니다. 예를 들어, 당신은

저는 여기에서 문제

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

    } 
} 

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

를 좁힐 쓴 샘플 프로그램입니다 (이 그래도 시도 모든 경우를 수정하지 않음) 명시 적으로 ICollection<DateTime>myList 캐스팅 언급 발현을 호출 할 수 있습니다 오류

  • new C<DateTime>(myList)없이 작동 - - 같은 휴식 당신이

    • Example(myList) 다음과 같은 평가를 시도 할 수의 실패 ame error

    이 시점에서 나는 Connect에 버그를 제기해야한다고 생각합니다. 그것은 분명히 버그 (비슷한 코드 VB.Net에서 작동)

  • +0

    고마워요! @ https://connect.microsoft.com/VisualStudio/feedback/details/684678/visual-studio-debugger-c-expression-evaluator-doesnt-work-with-bound-generic-types에서 연결 티켓을 열었습니다. 항상 해결 방법을 사용하여 최선을 다할 것입니다. –

    0

    그런 식으로 보입니다. 오류를 복제 할 수있었습니다. Mscorlib_CollectionDebugView<T>에는 ICollection<T>List<T>을 수락하는 하나의 생성자 만이 ICollection<T>을 구현합니다. 또한, 명시 적으로 ICollection<T> 작품에 캐스팅 :

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

    감사합니다. 나는 또한이 해결 방법을 발견했다. 그러나 나는 왜 이런 일이 일어날 지에 대해 더 염려하므로이 해결 방법이 항상 적용 가능한지 이해할 수 있습니다. (디버깅과 관련이있는 Visual Studio 확장 기능을 제작하고 있으므로 근본 원인을 이해하는 것이 중요합니다.) –

    관련 문제