【问题标题】:namespace and class has the same name [duplicate]命名空间和类具有相同的名称[重复]
【发布时间】:2016-01-04 09:41:19
【问题描述】:

我有以下课程

namespace COM.XX.ZZ{
 class XX{
 }
}

当我尝试在不同的类中使用它时

using COM.XX.ZZ;
class someClass{
 static void main(String args[]){
       XX.someMethod();
 }
}

Visual Studio 混淆了类和包,因为它们的名称相同。 命名空间和类应该始终不同是不是 Visual Studio 的一个已知限制?

【问题讨论】:

  • 显示什么错误?
  • 你有一个同名的类和命名空间这一事实是一个糟糕的设计决定。为自己节省很多痛苦并改变其中一个。命名空间应描述一般类别/区别,例如MyApp.Web.WebSockets,包含该类别下的特定类,例如WebSocketFactoryThingy。在我看来,一个类的名称不应该是命名空间的一部分。但是,这只是我。
  • Visual Studio 的哪个版本?
  • XX.someMethod() 不是静态方法(但你这样调用,你会调用静态方法),所以我猜 XX 是一个类的实例,对吧?
  • plural形式定义命名空间,以singular形式定义类名,瞧,问题就迎刃而解了。

标签: c# visual-studio class namespaces


【解决方案1】:

如果你的类有静态方法,叫做SomeMethod(),是可访问的,比如:

namespace COM.XX.ZZ
{
    class XX
    {
        public static void SomeMethod()
        {

        }
    }
} 

你可以使用它:

using COM.XX.ZZ;

class someClass
{
    static void main(String args[])
    {
       COM.XX.ZZ.XX.SomeMethod();
    }
}

请注意,我在调用静态方法之前添加了完整的命名空间前缀。

编辑:命名空间和类使用相同的名称确实不是一个好主意。

【讨论】:

    【解决方案2】:

    没有必要有单独的类名和命名空间名,但事实上,编译器有时会感到困惑。对于各方来说,最好将命名空间名称和类名称分开。

    如果您确实想使用相同的名称,您可以帮助编译器不要混淆。为您的班级使用using

    using XXClass = COM.XX.ZZ.XX;
    

    那么你可以这样使用它:

    XXClass.someMethod();
    

    这是far from recommended,所以我建议重命名它们中的任何一个。


    这可能失败的另一个原因是someMethod 不是静态的。在这种情况下,编译器认为您指的是XX-the-namespace。先尝试实例化XX

    XX xx = new XX();
    xx.someMethod();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2011-12-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多