如何在Visual Studio的调试器中摆脱System .__ Canon?

时间:2016-09-16 06:03:59

标签: c# visual-studio

当我使用通用引用类型与通用结构的组合时,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而不是该字段的实际内容:

http://docs.particular.net/samples/servicecontrol/events-subscription/

实际上,如果我将此行添加到Watch窗口,可以查看struct内容:((S<string>) foo.ClassItem).StructItem。在这种情况下,我可以看到“Bar”字符串。但是对于大型项目和更复杂的类型来说,这是一个巨大的痛苦。那么有没有办法让调试器正常运行?

我有两个版本的Visual Studio:2013和2015,它们的行为方式相同。

1 个答案:

答案 0 :(得分:1)

您可以查看.NET source containing System.__Canon

根据之前的评论,似乎这个类是泛型类型实例化所必需的。

msdn

上提出了类似的问题

根据codeproject上的文章:

  

对于为a提供值类型的每个已关闭的通用类型   类型参数,CLR在运行时创建一个新类型并将其用于   实例化和其他目的。对于所有已关闭的通用类型   给定了随参考类型提供的通用类型,CLR创建   一种类型,其中参数类型为的类型参数   提供,替换为名为System .__ Canon的特殊类型。