2016-09-16 3 views
0

Визуальный отладчик студии ведет себя странно, когда я использую сочетание общего ссылочного типа с общей структурой:Как избавиться от System .__ Canon в отладчике Visual Studio?

class C<T> 
{ 
    public T ClassItem { get; set; } 
} 

struct S<T> 
{ 
    public T StructItem; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var foo = new C<S<string>> {ClassItem = new S<string> {StructItem = "Bar"}}; 
    } 
} 

Когда я пытаюсь заглянуть в поле ClassItem, я вижу странный System.__Canon вместо фактических содержимого поля :

screenshot of the debugger

на самом деле, есть способ взглянуть на содержание структуры, если добавить эту строку в окне Watch: ((S<string>) foo.ClassItem).StructItem. В этом случае я вижу строку «Бар». Но это большая боль с большими проектами и более сложными типами. Так есть способ заставить отладчика вести себя нормально?

У меня есть две версии Visual Studio: 2013 и 2015, оба они ведут себя одинаково.

ответ

0

Вы можете посмотреть в .NET source containing System.__Canon

Согласно комментариям, прежде чем он, кажется, что этот класс необходим для общих типов инстанцирования.

Аналогичный вопрос задают на msdn

Согласно статье на codeproject:

Для каждого замкнутого универсального типа, который поставляется с типом значения для Тип параметра, CLR создает новый тип во время выполнения и использует его для экземпляров и других целей. Для всех закрытых общих типов a , приведенных в Generic Type, который поставляется с ссылочным типом, CLR создает один тип, в котором тип параметра, для которого используется ссылочный тип, является , заменен специальным типом System .__ Canon.

+0

Вопрос msdn связан с некоторой ошибкой в ​​.net 2.0 и, похоже, немного устарел. Цель __Canon теперь яснее для меня, но это был не вопрос. Вопрос заключался в плохих способностях отладчика при отображении содержимого структуры. Кажется, что единственный способ - заменить 'struct S ' классом. – koxy

Смежные вопросы