为什么泛型类型的名称会在 .NET 堆栈跟踪中被破坏?
我有一个从 C# 方法抛出的异常,该方法采用通用列表作为参数。
private static void DoWork(List<ClassName> a)
{
}
当它引发异常时,堆栈跟踪显示“1”而不是列表的类名。这是为什么呢?这就是堆栈跟踪的内容。
...
at DoWork(List`1 a).
...
I have an exception being thrown from a C# method, that takes a generic list as a paremeter.
private static void DoWork(List<ClassName> a)
{
}
When it throws an exception, the stack trace shows an `1 instead of the class name for the list. Why is this? This is what the stack trace has.
...
at DoWork(List`1 a).
...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
原因是堆栈跟踪是由 CLR 生成的,而不是 C# 生成的。因此,它使用 CLR 类型名称而不是 C# 类型名称。
元数据中为泛型类型指定的类型名称(在 C# 和 VB.Net 中)的形式为 TypeName`Number,其中
这也是原因拥有多个名称相同但泛型参数数量不同的泛型类是合法的。在 CLR 级别,它们具有不同的类型名称。
The reason why is that the stack trace is generated by the CLR and not C#. Hence it uses CLR type names vs. C# type names.
The type names given to generic types in metadata (in both C# and VB.Net) have the form TypeName`Number where
This is also why it's legal to have several generic classes which the same name but differing numbers of generic parameters. At a CLR level they have different type names.