`1 在 Stack Trace 中的意义

Significance of `1 in Stack Trace

堆栈跟踪中的 1 有什么意义?

   at Default.Process() in Default.cs:line 19
   at Framework.BasePage.ProcessRequest(HttpContext context) in BasePage.cs:line 82
   at Framework.Endpoint`1.Page[T](HttpContext context) in Endpoint.cs:line 44
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)

第三行:端点`1

这是通用参数的 arity(或计数)。

原因是您可以有多个 class 具有相同名称,但具有不同数量的通用参数。例如:

class Foo {}
class Foo<TKey> {}
class Foo<TKey, TValue> {}

为了区分它们,公共语言运行时指定了泛型类型的后缀是采用的泛型参数数量的规则。非通用类型不需要这个,因此它们的名称被编码为:

Foo
Foo`1
Foo`2

还使用了其他一些 "magic" 个字符。例如,名称中的 + 用于表示 inner/nested class。所以:

class Foo
{
  class Bar
  {
  }
}

将导致 Bar 被编码为 Foo+Bar