7

次のコードでは:

        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]」ノードを選択して [ウォッチの追加] をクリックすると、次の式がウォッチに追加されます。

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

この式は正しいように見えますが、ウォッチ ウィンドウには次のエラーが表示されます。

'System.Collections.Generic.Mscorlib_CollectionDebugView.Mscorlib_CollectionDebugView(System.Collections.Generic.ICollection)' に最も一致するオーバーロードされたメソッドには、いくつかの無効な引数があります

これはデバッガーのバグのようです。なぜこれが起こるのですか?そして、それはどこかに文書化されていますか?

4

2 に答える 2

1

これは、C# の式エバリュエーターのオーバーロード解決ロジックのバグのようです。ジェネリック型コンストラクターの呼び出しとバインドされたジェネリックの受け渡しの組み合わせが鍵のようです。これらのいずれかを削除すると、問題が解決するようです。たとえば、明示的にキャストmyListすることで言及された式を呼び出すことができますICollection<DateTime>(ただし、これは私が試したすべてのケースを修正するわけではありません)

問題を絞り込むために私が書いたサンプルプログラムは次のとおりです

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

    }
}

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

同じ休憩で、次の評価を試すことができます

  • Example(myList)- エラーなしで動作
  • new C<DateTime>(myList)- 同じエラーで失敗する

この時点で、Connectにバグを報告する必要があると思います。これは間違いなくバグです (同様のコードは VB.Net で正常に動作します)。

于 2011-08-18T18:22:12.040 に答える
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]
于 2011-08-18T14:46:19.163 に答える