繁体   English   中英

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

[英]Name conflict between namespace and class

我有一个带有多个名称空间的结构,并且在每个名称空间中都有一个静态类,该类在该名称空间的网络中有点小。 就像系主任一样

让我们以两个命名空间为例, 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.SomeMethod ,我宁愿只是Baz.SomeMethodQuuz.SomeMethod

有任何想法吗?

也许这可以帮助:

using Baz = Foo.Bar.Baz.Baz;

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

拥有此功能后,您可以执行以下操作:

using Foo.Bar.Baz;

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

或这个:

using baz = Foo.Bar.Baz.Baz;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM