5

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

internal class Thing

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

3 回答 3

11

从 IL 的角度来看,private这意味着程序集私有,即internal在 C# 中。

在 C# 中,不可能将类型标记为private好像它们不是嵌套的。IL 对此类类型的等效可访问性是nested private.

所以我们有:

  • C#'s internal-> IL's private(到程序集)
  • C#'s private-> IL's nested private(到封闭类型)
于 2013-09-06T14:48:04.750 回答
4

MSDN上,它说:

C# 关键字 protected 和 internal 在 IL 中没有任何意义,也不会在反射 API 中使用。IL 中对应的术语是 Family 和 Assembly。要使用反射识别内部方法,请使用 IsAssembly 属性。要识别受保护的内部方法,请使用 IsFamilyOrAssembly。

所以我想这只是让它们私有化,因为它们不能从其他地方访问。

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

于 2013-09-06T14:48:42.327 回答
3

The mapping of C# keywords to IL keywords isn't always a logical one. Ecma-335, section II.23.1.15 shows what flags are valid for a type. You'll see that it only defines Public, NotPublic and a set of NestedXxx flags. Nothing similar to "internal". So your class is actually NotPublic, displayed as "private" in ildasm.

It is easy to see a side-effect of this: try this declaration in your C# code:

private class DoesNotWork {
}

You'll get:

error CS1527: Elements defined in a namespace cannot be explicitly declared as private, protected, or protected internal

于 2013-09-06T14:54:47.693 回答