命名空间和类之间的名称冲突

时间:2013-11-26 11:43:06

标签: c# .net namespaces

我有一个带有多个命名空间的结构,并且在每个命名空间中我有一个静态类,它在该命名空间的网络中是一个小的小蜘蛛。就像部门主管一样。

我们举两个名称空间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

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

也许这会有所帮助:

using Baz = Foo.Bar.Baz.Baz;

答案 1 :(得分:0)

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

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

using Foo.Bar.Baz;

public void GetToWork()
{
    Baz.Baz.DoSomething();
}

或者这个:

using baz = Foo.Bar.Baz.Baz;

public void GetToWork()
{
    baz.DoSomething();
}

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