C# C中类型名称中的符号

C# C中类型名称中的符号,c#,C#,请帮助我理解这是什么: 我在程序集中查找类型,得到了一堆类型,所有类型的名称都相同,但方法不同: {Name = "<>c__DisplayClass1" FullName = "HelixToolkit.Wpf.ElementSortingHelper+<>c__DisplayClass1"} 一个快速的google提供了CodePlex的以下实现 “HelixToolkit.Wpf”是类型的名称空间前缀 “ElementSortingHelper”是本例中的类

请帮助我理解这是什么:

我在程序集中查找类型,得到了一堆类型,所有类型的名称都相同,但方法不同:

{Name = "<>c__DisplayClass1" 
  FullName = "HelixToolkit.Wpf.ElementSortingHelper+<>c__DisplayClass1"}

一个快速的google提供了CodePlex的以下实现

“HelixToolkit.Wpf”是类型的名称空间前缀 “ElementSortingHelper”是本例中的类型名称类 “+”表示以下是嵌套类型 “c__DisplayClass1”是自动生成的闭包类 方法。 您可以阅读生成的文档以获得更详细的解释。但本质上,编译器在ElementSortingHelper中自动生成了一个嵌套类型,用于支持至少捕获一个局部变量的匿名方法。查看ElementSortingHelper类的源代码,有两个方法可以创建lambda,因此该类将与实现其中一个相关


因为C不允许类型以“开头,所以编译器在将lambda表达式转换为类时使用命名约定

这里有一个例子。从这门课开始:

public class UserQuery
{
    private void Main()
    {
        var x = 42;
        Func<int> f = () => x;
        var y = f();
    }
}
编译器将其转换为:

public class UserQuery
{
  public UserQuery()
  {
    base..ctor();
  }

  private void Main()
  {
    UserQuery.<>\u003C\u003Ec__DisplayClass1 cDisplayClass1 = new UserQuery.<>\u003C\u003Ec__DisplayClass1();
    cDisplayClass1.x = 42;
    int num = new Func<int>((object) cDisplayClass1, __methodptr(<\u003CMain>\u003Eb__0))();
  }

  [CompilerGenerated]
  private sealed class <>\u003C\u003Ec__DisplayClass1
  {
    public int x;

    public <>\u003C\u003Ec__DisplayClass1()
    {
      base..ctor();
    }

    public int <\u003CMain>\u003Eb__0()
    {
      return this.x;
    }
  }
}

不是合法的c,而是合法的IL。

很可能是因为它被混淆了,所以您无法轻松了解到底发生了什么。@测试:我非常怀疑Microsoft是否考虑过混淆已编译的msil,而是生成保证唯一的名称,因为它们在c中是非法的,但在msil中是合法的。