为什么generics类型的名称在.NET堆栈跟踪中被破坏?

我从C#方法抛出exception,它将通用列表作为参数。

private static void DoWork(List a) { } 

当它抛出exception时,堆栈跟踪显示“1”而不是列表的类名。 为什么是这样? 这就是堆栈跟踪的含义。

 ... at DoWork(List`1 a). ... 

原因是堆栈跟踪是由CLR而不是C#生成的。 因此,它使用CLR类型名称与C#类型名称。

元数据中的generics类型(在C#和VB.Net中)的类型名称具有TypeName`Numberforms

  • TypeName:generics参数的abscence中的类型名称
  • Number:类型上的通用参数计数

这也是为什么有几个通用类具有相同名称但通用参数数量不同的原因。 在CLR级别,它们具有不同的类型名称。