c# - 当存在同名命名空间时(在当前范围内),如何引用它们中的任何一个?

标签 c#

我有:

namespace Book {
   ...
}

    ...
    ...



namespace Company 
{ 
    public class Book {

    }
    ...
    ...
    ...
    ...
    ...
    ...
    public class MyBook : Book.smth
    {
    }
}

我是如何实现的,作为 MyBook 继承顶级 Book 命名空间,而不是 Company 的?

最佳答案

首先,理想情况下,您一开始就不会陷入这种糟糕的境地。尝试命名您的 namespace 和类,以便它们不会与您的依赖项冲突!但有时这是不可避免的,尤其是当依赖项添加了您已经实现的功能时。


技巧 #1:

您可以使用 global:: 修饰符来做到这一点。

namespace Company 
{ 
  namespace Xyz 
  { 
    public class DefaultClass {} 
  }
  public class myClass: global::Xyz.DefaultClass

现在 Xyz.DefaultClass 指的是顶级 Xyz.DefaultClass,而不是 Company.Xyz.DefaultClass


技巧#2:

在命名空间上使用using alias 指令:

using TheOtherXyz = Xyz;
namespace Company {
  namespace Xyz 
  { 
    public class DefaultClass {} 
  }
  public class MyClass : TheOtherXyz.DefaultClass

或在类里面:

using TheOtherDefault = Xyz.DefaultClass;
namespace Company {
  namespace Xyz 
  { 
    public class DefaultClass {} 
  }
  public class MyClass : TheOtherDefault

请注意,第二个变体适用于泛型类。你可以说

using StringList = System.Collections.Generic.List<String>

但你不能说

using MyList<T> = System.Collections.Generic.List<T>

做一个通用的别名。这是一个非常明智的功能,只是从来没有足够高的优先级来添加它。


一个你没有问过的问题,但我还是会回答的:

What if I have namespace N with class C in two different assemblies that I am referencing? N.C is now ambiguous and global:: doesn't help, and neither does a using alias directive.

在那种不幸的情况下,您使用了一个外部别名指令,您可以在这里阅读它。

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/extern-alias


如果您对发生此类名称冲突时可能出现严重错误的其他事情感兴趣,请在此处查看我关于该主题的文章:

https://blogs.msdn.microsoft.com/ericlippert/tag/namespaces/

关于c# - 当存在同名命名空间时(在当前范围内),如何引用它们中的任何一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459324/

相关文章:

c# - 根据当前文化调用不同的(本地化的) View

c# - 可以接受内容类型 : text/plain? 的 WCF WebInvoke

c# - 无法在单元测试中加载文件或程序集“System.Web.Mvc”

c# - 文本更改事件未触发

c# - 用于公开从 xml 读取的数据的单例与静态类

c# - 我的网络配置文件 : 有问题

c# - 将 IEnumerable<T> 添加到派生自 CollectionBase 的类

c# - 连接到 ftps ://URL

c# - C# 中的下拉列表

c# - 调用 this() 构造函数和不同的 base() 构造函数