当我将一个类声明为内部时,为什么IL将其显示为私有?

如果我将一个类声明为内部类,为什么IL将其显示为私有?

internal class Thing .class private auto ansi beforefieldinit Thing.Thing extends [mscorlib]System.Object 

从IL的角度来看, private意味着组装私有 ,即C# internal

在C#中,如果类型不是嵌套的 ,则无法将类型标记为private 。 IL对这些类型的等效可访问性是nested private

所以我们有:

  • C#的internal – > IL的private (对程序集)
  • C#的private – > IL的nested private (到封闭类型)

在MSDN上 ,它说:

C#关键字protected和internal在IL中没有任何意义,并且不在reflectionAPI中使用。 IL中的相应术语是Family和Assembly。 要使用reflection标识内部方法,请使用IsAssembly属性。 要标识受保护的内部方法,请使用IsFamilyOrAssembly。

所以我想它只是让它们变得私密,因为它们无法从其他地方访问。

编辑:我看到我的答案可能不完全正确,我只是认为这是值得注意的事情。 我链接的MSDN文章在这个“我们编写的代码” – “它变成什么样”的关系中有一些有趣的东西。

C#关键字到IL关键字的映射并不总是合乎逻辑的。 Ecma-335,第II.23.1.15节显示了哪种标志对一种类型有效。 你会看到它只定义了Public,NotPublic和一组NestedXxx标志。 没有类似于“内部”的东西。 所以你的class级实际上是NotPublic,在ildasm中显示为“私人”。

很容易看到这样的副作用:在C#代码中尝试此声明:

 private class DoesNotWork { } 

你会得到:

错误CS1527:命名空间中定义的元素不能显式声明为private,protected或protected internal