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

时间:2013-09-06 14:34:32

标签: c# .net cil

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

internal class Thing

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

3 个答案:

答案 0 :(得分:11)

从IL的角度来看,private表示私有程序集,即C#中的internal

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

所以我们有:

  • C#的internal - > IL的private(对集会)
  • C#的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