【问题标题】:Namespace, assembly, and inheritance hierarchy when including包含时的命名空间、程序集和继承层次结构
【发布时间】:2014-06-30 02:27:12
【问题描述】:

在我的代码中包含命名空间或程序集时,我经常会遇到一些奇怪的情况,即一个命名空间是从另一个命名空间继承而来的,而父命名空间中的类却不可用。例如,当使用List<>Dictionary<> 时,我使用System.Collections.Generic 命名空间。但是,如果我还想使用IEnumerator,我还必须包含System.Collections 命名空间。 System.Collections 不应该已经被System.Collections.Generic 的任何成员引用,因为它是一个孩子?两个命名空间还共享同一个程序集 mscorlib.dll。

为什么没有包含子命名空间的父命名空间?

【问题讨论】:

  • 因为编译器很笨。并且必须被告知要包括什么。或者问题是什么?
  • @Sinatr 这就是问题所在,我只是想知道为什么编译器如此愚蠢以至于不包含父命名空间
  • @OutlawLemur:“愚蠢”我认为您的意思是“遵守语言规范”。

标签: c# inheritance namespaces assemblies class-hierarchy


【解决方案1】:

System.Collections 是否应该已经被 System.Collections.Generic 的任何成员引用,因为它是一个孩子?

没有。命名空间之间没有继承。 using 指令从该命名空间导入类型 - 它不会从具有给定命名空间的命名空间开始导入类型,或包含在给定命名空间名称中的命名空间。

例如,之后:

using System.Collections;

...这不允许您使用List<T> 作为System.Collections.Generic.List<T> 的简单名称,也不允许您使用Guid 作为System.Guid 的简单名称。

唯一的例外是,如果您在 X.Y.Z 的命名空间声明中编写代码,则会隐式导入命名空间 X.YX(以及 X.Y.Z , 当然)。 (在该示例中,X.Y封闭命名空间,如果 X.Y.Z,但它不是继承关系。)

【讨论】:

  • 所以命名空间之间没有实际的继承,Msdn 只是在不好的上下文中使用了这个术语? (例如见List<>
  • @OutlawLemur:它在该文档中的哪些地方错误地使用了该术语? (请准确引用。)
  • 继承层次部分中的代码示例或语法之前
  • @OutlawLemur:这显示了 type 的继承 - 例如,System.Collections.Generic.List<T> 继承自 System.Object。我没有看到任何暗示一个 namespace 从另一个继承。 (例如,Foo.Bar.Baz 类型可以从 A.B.C 类型继承。这并不意味着 Foo.BarA.B 命名空间之间存在关系。)
  • @OutlawLemur:不,我想你误解了我的回答。关键是,如果您在命名空间X.Y.Z编写代码,则可以使用XX.Y 中的类型,而无需显式导入它们。这对使用您的类型的任何人没有影响 - 它仅在您的源代码中。同样,命名空间没有继承意义上的“子代”。
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多