【问题标题】:Name conflict between namespace and class命名空间和类之间的名称冲突
【发布时间】:2013-12-11 12:59:58
【问题描述】:

我有一个包含多个命名空间的结构,并且在每个命名空间中我都有一个静态类,它有点像该命名空间网络中的一个小型蜘蛛。像部门负责人。

让我们以Foo.Bar.BazFoo.Bar.Quux 这两个命名空间为例。

我有一个文件如下所示:

namespace Foo.Bar.Baz
{
  static class Baz
  {
    public static void DoSomething()
    {
      Console.Writeline("Doing something...");
    }
  }
}

然后是第二个文件:

using Foo.Bar.Baz
namespace Foo.Bar.Quux
{
  static class Quux
  {
    public static void GetToWork()
    {
      Baz.DoSomething();
    }
  }
}

现在,当我尝试编译时,第二个文件中出现错误,因为它认为 Baz 是命名空间而不是类。但是因为我有using Foo.Bar.Baz 行,所以在该命名空间中使用任何类都应该没问题,而不需要在它前面加上命名空间的名称,对吧?我可以正确使用该命名空间中的其他内容,但不能使用同名的类。

感觉就像编译器偷偷在每个文件中添加了这一行:using Foo.Bar

此外,我不能只将静态 Baz 类放在 Foo.Bar 命名空间中,因为那时我会收到错误消息,指出 Foo.Bar.Baz 不是命名空间(因为我在该命名空间中有其他东西并且有文件使用该命名空间)。然后编译器似乎看到了静态类并确定Foo.Bar.Baz 是静态类而不是命名空间。

当然,我可以将静态类重命名为像 Manager 这样的名称,但我仍然需要在需要从两个名称空间访问内容的文件中拼出完整的 Baz.Manager.SomeMethodQuux.Manager.SomeMethod。这感觉相当笨拙,我宁愿让它成为Baz.SomeMethodQuuz.SomeMethod

有什么想法吗?

【问题讨论】:

  • 我的想法是不要将类命名为命名空间
  • 参见blogs.msdn.com/b/ericlippert/archive/2010/03/09/… 以及该系列的后续帖子。
  • (有重复的问题,但我现在没时间找。)
  • 我不希望对类和命名空间使用相同的名称,但我就是想不出一个好的名称结构。 :(

标签: c# .net namespaces


【解决方案1】:

也许这会有所帮助:

using Baz = Foo.Bar.Baz.Baz;

【讨论】:

    【解决方案2】:

    由于Baz 是一个静态类,它不能包含实例成员。所以,DoSomething() 必须声明为静态方法。

    一旦你有了这个,你可以这样做:

    using Foo.Bar.Baz;
    
    public void GetToWork()
    {
        Baz.Baz.DoSomething();
    }
    

    或者这个:

    using baz = Foo.Bar.Baz.Baz;
    
    public void GetToWork()
    {
        baz.DoSomething();
    }
    

    但是,我同意您的问题中的 cmets,即对命名空间(一组类的逻辑容器)及其包含类(封装数据和行为)使用相同的名称可能会导致可读性/可维护性问题。

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 2023-03-11
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多