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" で開いて[クイックウォッチを壊した場合、私は以下を参照してください

myList 
    [0] 
    Raw View 

私は "[0]" ノードを選択してクリックした場合ウォッチ、時計のために追加された式を追加します。

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

この表現が正しいようで、まだ、ウォッチウィンドウが目を表示e次のエラー:

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エラー

    この時点では、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>を受け入れるコンストラクタが1つだけあり、ICollection<T>が実装されています。また、明示的にICollection<T>作品にキャスト:

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

    ありがとうございます。私はこの回避策も見つけました。しかし、なぜこのようなことが起こるのか、私はこの回避策が常に適用可能かどうかを理解するために(私はデバッグと関係があるVisual Studio拡張をオーサリングしているので、根本原因を理解することが重要です) –

    関連する問題