“Class”是一个命名空间,但被用作“类型”。

3
首先,除非我错过了其中一个问题,否则这与许多高票问题在此确切主题上的情况不同。它们都指出问题是我有一个与类同名的命名空间。但这不是这种情况(但曾经是)。
我一开始创建了一个名为“BatchResizer”的新控制台应用程序并放置了几个类,但后来决定将其移动到一个名为“BatchResizer.Components”的类库中。然后我将原始控制台应用程序重命名为“BatchResizer.ConsoleRunner”,在该项目中更改了所有类为“namespace BatchResizer.ConsoleRunner.[...]”,并将程序集名称和默认命名空间设置为相同。
有一个名为“BatchResizer”的类,但项目中不再有任何名为“[...].BatchResizer”的命名空间,但当我执行“var batchResizer = new BatchResizer()���时,我会得到使用命名空间作为类的错误。有像“BatchResizer.ConsoleRunner.[...]”或“BatchResizer.Components.[...]”这样的命名,但没有以“BatchResizer”结尾的命名。
我已尝试“清理”和重新构建项目,删除“.suo”文件,删除解决方案中所有项目的“/bin”文件夹,并检查所有相关项目中的每个类以进行命名空间冲突。

有一个名为BatchResizer的类,但没有命名空间叫做[...].BatchResizer。 - Tom
1
如果您能够粘贴相关代码的类头部,那将会使事情变得更加容易。请在谷歌上搜索“msdn 命名空间”。 - MethodMan
这就是给一个类与其命名空间相同的有趣之处,你可能需要使用new BatchResizer.BatchResizer()来实例化它。尽量避免将任何东西命名为其父容器的相同名称。 - Ron Beyer
2个回答

15

BatchResizer仍然是一个命名空间名称。如果它也是一个类的相同名称,你就必须更加明确:

var batchResizer = new Components.BatchResizer();

你也可以在命名空间中添加using语句:

namespace BatchResizer.ConsoleRunner
{
    using Components;   

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

如果你想要稍微有点极客,那么C# 5.0规范如下所述:

9.2 命名空间声明

...命名空间声明的限定符标识符可以是单个标识符或由“.”标记分隔的一系列标识符。后一种形式允许程序定义嵌套命名空间而不需要在语法上嵌套多个命名空间声明。例如:

namespace N1.N2
{
    class A {}
    class B {}
}

语义上等同于

namespace N1
{
    namespace N2
    {
        class A {}
        class B {}
    }
}

所以,即使你说在命名空间BatchResizer中没有声明任何classBatchResizer仍被声明为一个命名空间。


1

首先,除非我错过了其中一个问题,否则这与许多高赞的关于此主题的问题不同。所有这些问题都指出问题是我有一个与类相同名称的命名空间。这不是情况(但曾经是)。

BatchResizer 可能不是一个“final”命名空间,但它仍然是一个命名空间。

Namespace : Foo.BatchResizer.Components
            Foo.BatchResizer.ConsoleRunner
Class :     Foo.BatchResizer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接