Почему отладчик Visual Studio не будет правильно оценивать выражения, содержащие аргументы универсального типа? - PullRequest
7 голосов
/ 17 августа 2011

В следующем коде:

        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
        }

Если я ломаюсь в отладчике, открываю QuickWatch на «myList», я вижу:

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)' имеет недопустимые аргументы

Это похоже на ошибку в отладчике. Почему это происходит? И задокументировано ли это где-нибудь?

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Это похоже на ошибку в логике разрешения перегрузки в 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)

0 голосов
/ 18 августа 2011

выглядит так. Я был в состоянии повторить ошибку. Mscorlib_CollectionDebugView<T> имеет только один конструктор, принимающий ICollection<T>, а List<T> реализует ICollection<T>. Кроме того, явное приведение к ICollection<T> работает:

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