在班级名称中加上"+"?

Gra*_*een 12 c# class separator

班级名称: MyAssembly.MyClass+MyOtherClass

问题显然是+作为分隔符,而不是传统点,它的功能,并找到官方文档,看看是否存在其他分隔符.

Jon*_*eet 20

这就是表示嵌套类型的方式.例如:

namespace Foo
{
    class Outer
    {
        class Nested {}
    }
}
Run Code Online (Sandbox Code Playgroud)

Foo.Outer+Nested在编译的代码中创建一个全名的类型.(typeof(Outer.Nested).FullName例如,这就是返回的东西.)

我不清楚这是指定的行为,还是Microsoft C#编译器选择使用的行为; 它是一个"不可言喻"的名称,因为你无法在普通的C#中明确地声明一个带有+的类,所以编译器知道它不会与其他任何东西冲突.据我所知,C#3规范的第10.3.8节没有规定编译的名称.

编辑:我刚刚看到,Type.AssemblyQualifiedName指定"+"用于嵌套类型名称之前...但它仍然不清楚是否实际需要或只是常规.

  • 此实现细节表现的另一种方式是嵌套泛型类型.如果你有嵌套类Inner <U>的类Outer <T>,你会看到你在元数据中实际获得的是两种类型,Outer <`1>和Outer + Inner <`2>.从CLR的角度来看,嵌套类型实际上只是语言告诉的一个方便的文件.嵌套显示为"真实",只是内部类型访问外部类型的私有成员的能力.(命名空间同样是虚构的.) (2认同)
  • ECMA CLI规范的第10.7.2节提到"虽然在元数据中编码的类型名称未明确提及其封闭类型,但CIL和反射类型名称语法确实包含此详细信息",后面是包含词法的示例表名称(例如"XY")元数据编码(例如"Y"),CIL名称(例如"X/Y")和反射名称(例如"X + Y"). (2认同)

Ben*_*igt 10

这是编译器在元数据中用来表示嵌套类的内容.

class A { class B {} }
Run Code Online (Sandbox Code Playgroud)

会被视为

class A+B
Run Code Online (Sandbox Code Playgroud)

在元数据中

  • @Ben - 这很公平; 用规范作家接受它:)我只是引用他们的表.在任何情况下,我认为声称ILDASM"撒谎"有点过头了.它只有自己的类型语法. (2认同)