С момента начала использования контрактов кода (.NET 4.0, VS2010 Ultimate и Premium) мы столкнулись со странной проблемой в окнах отладчика.
У меня есть простое решение с одним исполняемым файлом, одна библиотека, которая использует кодКонтракты и одна библиотека, которая этого не делает.Каждая библиотека содержит один класс и в конструкторе класса инициализирует список целых чисел.Если мы поместим точку останова после инициализации списка и посмотрим на нее в окнах отладчика (включая непосредственное окно), мы сможем увидеть значения просто отлично.Однако, если мы попытаемся привести значение к явному типу, оно сломается.
В библиотеках, которые не используют Code Contracts, в окнах отладчика работают следующие функции:
(List<int>)nums
В библиотеках, которые используют Code Contracts, создается «Тип или пространство имен« Список »недопустимо в этой области ». Мы должны сделать следующее, чтобы заставить его работать:
(System.Collections.Generic.List<int>)nums
Обратите внимание, что код работает нормально, проблем нет, проблема только в окнах отладчика.
ОБНОВЛЕНИЕ: Единственный параметр, который, кажется, оказывает влияние, - это флажок рядом с «Выполнить проверку контракта во время выполнения» на вкладке «Контракты кода» в свойствах проекта. После просмотра кода в ILSpy,Я нашел атрибут, добавленный в assemblyinfo.cs, атрибут (RuntimeContractsAttribute) и перечисление (RuntimeContractsFlags), добавленный в мой проект. По какой-то причине я скопировал код для этих элементов из ILSpy и создал свою собственную версию. Теперь всеработает. Но когда я выбираю «Построить» ссылочную сборку контракта, сборка завершается неудачно. (Я предполагаю, что генератор ссылокпытается добавить код, сгенерированный компилятором, и бомбы вызывают его добавление вручную.) Однако, без добавления кода времени выполнения вручную, отладчик все равно не работает независимо от параметра Ссылочная сборка контракта сборки.