为什么同一命名空间中的一个类看不到另一个类?

4

我一直在开发一个应用程序,遇到了一个我从未见过的异常错误。我有两个类,一个是用户控件(UserControl),另一个是窗体(Form),设置如下:

namespace NC
{
    public partial class Board : UserControl
    {
        // stuff
    }
}

namespace NC
{
    partial class Board
    {
        // this is the *.designer.cs file
    }
}

namespace NC
{
    public partial class MainForm : Form
    {
        // normal form stuff
    }
}

namespace NC
{
    partial class MainForm
    {
        // this is the *.designer.cs file. it has a Board added to it.
    }
}

所有相关内容都包含在同一个项目中,所以这不应该成为问题。然而,在编译时出现了以下错误:

The type name 'Board' does not exist in the type 'NC.NC'

我查看了表单设计文件,发现了以下内容:

this.Board1 = new NC.Board();

我删除了命名空间,它正常工作。每次访问表单编辑器时,它会再次添加。以前从未遇到过任何问题。是否有一些设置或其他东西可以更改?

4个回答

3

你是否有一个名为NC的类?如果有,最好将其重命名为其他名称。这听起来像编译器正在寻找一个名为NC的类中的Board,而不是命名空间NC中的Board...


这正是问题所在。该项目已远远超出了其最初的范围。它最初只是一个运行一些基本测试的单个类。我忘记了该类与命名空间具有相同的名称。谢谢! - Chris Boden
Mike:不错的想法。@Chris:看看这个链接,了解更多关于为什么处于这种可怕的情况中的细节:http://blogs.msdn.com/b/ericlippert/archive/tags/namespaces/ - Eric Lippert
@Eric:你的博客文章让我想到了这个:D - Mike Caron
@Eric:这是一篇不错的文章,谢谢!通常我在实际项目中并不这样做。最初我只是编写了一个单一的类来测试我所拥有的想法。随着我不断涌现更多的想法,它变得越来越庞大,而我已经完全忘记了最初的类。感谢您的帮助。 - Chris Boden

0

您的项目设置页面有一个默认命名空间。请查看那里。

实际上,默认命名空间名称不应该导致这种行为。例如,我刚刚创建了一个空的 Windows Forms 应用程序,它的默认命名空间设置为 WindowsFormsApplication1,这是 VS 内部解决方案的名称。


Winforms设计器在生成代码时是否使用此默认命名空间?解决方案是什么?是删除默认命名空间吗? - Robert Harvey
正如Mike Caron所回答的那样,看起来你有一个名为NC的类与其他东西冲突并搞乱了事情。你的项目/解决方案中是否有这样一个类? - Leniel Maccaferri

0

如果您使用命名空间来访问类,则必须使用完整的命名空间(可能是ProjectName.NC.Board)或者它必须比您可以访问的任何命名空间更深。
Board与您已经在其中的相同命名空间中,因此您不需要使用命名空间来限定它。


Winforms 设计器正在生成此代码,因此问题在其他地方。 - Robert Harvey
啊,我错过了那一点。在这种情况下,我和你一样困惑。 - JupiterP5

0
如果你从同一命名空间内调用 [namespace].[class],C# 会假设你要调用名为 NC 的类,即使你没有这样一个类。也就是说,它会自动在你调用的任何东西后添加 NC.,除非它引用了外部命名空间(System.[whatever]); 因此,对 NC.Board 的调用会被转换为 NC.NC.Board

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