2

我试图通过利用using namespaceWindows 窗体项目来节省一些编码时间。我在 VS2010 中使用 C++/CLI 创建了一个默认的 Windows 窗体项目。我注意到导入的默认命名空间是:

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

我想创建一个DialogResult-typed 变量,它(足够方便!)位于System::Windows::Forms命名空间内。我进入默认构造函数Form1并添加以下行:

DialogResult dr;

我得到编译器错误syntax error : missing ';' before identifier 'dr'

但是,如果我将行更改为:

Windows::Forms::DialogResult dr;

或者

System::Windows::Forms::DialogResult dr;

然后一切都按预期工作。

我也尝试添加

using namespace System::Windows;

进而

Forms::DialogResult dr

也有效!

关于这些命名空间的工作方式,我缺少什么?!我想避免必须完全限定我正在编写的所有代码,但我无法弄清楚我做错了什么,因为我需要的命名空间应该已经被导入。

4

1 回答 1

5

System::Windows::Forms::Form有一个名为 的属性DialogResult,因此在Form子类内部,该属性的范围优先于全局命名空间中的类型。

我通常使用 typedef 来解决这个问题:

typedef System::Windows::Forms::DialogResult DialogResult_t;

然后任何时候你需要使用类型,使用DialogResult_t,任何时候你需要访问属性,使用DialogResult

请注意,这个问题不是 C++/CLI 特定的——C++ 具有相同的范围规则,因此会有相同的问题;只是.NET BCL 非常广泛地重用类型名称作为属性名称(C++ 代码会避免这种情况),因为C#没有这个问题。

于 2012-04-04T16:59:07.707 回答