当我使用通用引用类型与通用结构的组合时,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,它们的行为方式相同。
答案 0 :(得分:1)
您可以查看.NET source containing System.__Canon
根据之前的评论,似乎这个类是泛型类型实例化所必需的。
在msdn
上提出了类似的问题根据codeproject上的文章:
对于为a提供值类型的每个已关闭的通用类型 类型参数,CLR在运行时创建一个新类型并将其用于 实例化和其他目的。对于所有已关闭的通用类型 给定了随参考类型提供的通用类型,CLR创建 一种类型,其中参数类型为的类型参数 提供,替换为名为System .__ Canon的特殊类型。