'Class'是一个命名空间,但是像'type'一样使用

Tom*_*Tom 0 c# namespaces visual-studio

首先,这是不一样的这个确切的话题很多高upvoted问题,除非我失去了其中的一个.所有这些都指出问题是我有一个与类同名的命名空间.这是不是的情况下(但它).

我开始创建一个名为的新控制台应用程序BatchResizer并在其中放置几个​​类,但后来决定将其移动到一个名为库的类库中BatchResizer.Components; 然后我将原始控制台应用程序重命名为BatchResizer.ConsoleRunner,将该项目中的所有类更改为namespace BatchResizer.ConsoleRunner.[...],将程序集名称和默认名称空间设置为相同.

有一个标题为类的类,但项目BatchResizer中没有命名空间[...].BatchResizer,但是当我这样做时,var batchResizer = new BatchResizer()我得到的错误是命名空间被用作类.有是命名为喜欢的项目BatchResizer.ConsoleRunner.[...]或BatchResizer.Components.[...],但在没有结束BatchResizer.

我试过"清理"并重新制作项目,删除.suo文件,删除/bin解决方案中所有项目的文件夹,并且我已经浏览了所有相关项目中的每个类的命名空间冲突.

Cha*_*ger 12

BatchResizer但仍然是命名空间名称.如果它也是一个类的名称,你必须更明确:

var batchResizer = new Components.BatchResizer();
Run Code Online (Sandbox Code Playgroud)

您还可以在命名空间中添加using语句:

namespace BatchResizer.ConsoleRunner
{
    using Components;   

    internal class Program
    {        
        private static void Main(string[] args)
        {
            var batchResizer = new BatchResizer();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你想变得有点怪异,那么C#5.0规范就是这样说的:

9.2命名空间声明

...命名空间声明的限定标识符可以是单个标识符或由"."标记分隔的标识符序列.后一种形式允许程序定义嵌套的命名空间,而不用词法嵌套多个命名空间声明.例如,

namespace N1.N2
{
    class A {}
    class B {}
}
Run Code Online (Sandbox Code Playgroud)

在语义上等同于

namespace N1
{
    namespace N2
    {
        class A {}
        class B {}
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,即使如你所说,class在名称空间中声明no BatchResizer,BatchResizer 也会被声明为名称空间.