2016-09-16 39 views
0

Visual Studio的調試器奇怪的行爲時,我用普通的結構一般引用類型的組合:如何在Visual Studio的調試器中擺脫System .__ Canon?

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

其實,有在結構內容偷看的方式,如果我這一行添加到監視窗口:((S<string>) foo.ClassItem).StructItem。在這種情況下,我可以看到「Bar」字符串。但對於大型項目和更復雜的類型而言,這是一個巨大的痛苦。那麼有沒有辦法讓調試器正常運行?

我有兩個版本的Visual Studio:2013和2015,他們的行爲方式都是一樣的。

回答

0

你可以看看.NET source containing System.__Canon

根據評論,它似乎在此之前,這個類所需的通用類型的實例。

類似的問題是關於msdn

要求根據文章codeproject

對於每個關閉了與一個 類型參數值類型提供的泛型類型,CLR創建一個新的類型在運行時期間並將其用於實例化和其他目的。對於提供了參考類型的給定泛型類型的所有封閉泛型類型,CLR創建一個類型爲 的類型,其中參考類型爲 的類型參數被替換爲名爲System .__ Canon的特殊類型。

+0

msdn問題與.net 2.0中的一些錯誤有關,它似乎過時了一點。 __Canon的目的現在對我來說更加清楚,但這不是問題。問題是關於顯示結構內容的糟糕的調試器功能。這似乎是唯一的方法是用一個類來替換'struct S '。 – koxy