如果我将一个类声明为内部类,为什么IL会将其显示为私有?
internal class Thing
.class private auto ansi beforefieldinit Thing.Thing
extends [mscorlib]System.Object
答案 0 :(得分:11)
从IL的角度来看,private
表示私有程序集,即C#中的internal
。
在C#中,如果类型不是nested,则无法将类型标记为private
。 IL对此类型的等效可访问性为nested private
。
所以我们有:
internal
- > IL的private
(对集会)private
- > IL的nested private
(封闭式)答案 1 :(得分:4)
在MSDN上,它说:
C#关键字受保护且内部在IL中没有意义 没有在反射API中使用。 IL中的相应术语是 家庭和集会。要使用反射识别内部方法, 使用IsAssembly属性。要识别受保护的内部方法, 使用IsFamilyOrAssembly。
所以我猜它只是让它们变成私有的,因为无法从其他地方访问它们。
编辑:我看到我的回答可能不完全正确,我只是觉得这是值得注意的事情。我链接的MSDN文章在这个“我们编写的代码” - “它变成什么样”的关系中有一些有趣的东西。
答案 2 :(得分:3)
C#关键字到IL关键字的映射并不总是合乎逻辑的。 Ecma-335,第II.23.1.15节显示了哪种标志对一种类型有效。你会看到它只定义了Public,NotPublic和一组NestedXxx标志。没有类似于“内部”的东西。所以你的班级实际上是NotPublic,在ildasm中显示为“私人”。
很容易看到这样的副作用:在C#代码中尝试此声明:
private class DoesNotWork {
}
你会得到:
错误CS1527:命名空间中定义的元素不能显式声明为private,protected或protected internal