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

发布于 2024-08-03 20:46:28 字数 229 浏览 3 评论 0原文

我有一个从 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

余生一个溪 2024-08-10 20:46:28

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

元数据中为泛型类型指定的类型名称(在 C# 和 VB.Net 中)的形式为 TypeName`Number,其中

  • 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

  • TypeName: Name of the type in the abscence of generic parameters
  • Number: Count of generic parameters on the type

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文