Windows窗体应用程序中使用C ++ / CLI的命名空间混乱

aar*_*rkk 2 .net c++-cli visual-studio-2010 winforms

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

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
Run Code Online (Sandbox Code Playgroud)

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

DialogResult dr;
Run Code Online (Sandbox Code Playgroud)

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

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

Windows::Forms::DialogResult dr;
Run Code Online (Sandbox Code Playgroud)

要么

System::Windows::Forms::DialogResult dr;
Run Code Online (Sandbox Code Playgroud)

然后一切都会按预期进行。

我也尝试添加

using namespace System::Windows;
Run Code Online (Sandbox Code Playgroud)

然后

Forms::DialogResult dr
Run Code Online (Sandbox Code Playgroud)

也可以!

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

ild*_*arn 5

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

我通常使用typedef解决此问题:

typedef System::Windows::Forms::DialogResult DialogResult_t;
Run Code Online (Sandbox Code Playgroud)

然后,无论何时需要使用type,use DialogResult_t,以及何时需要访问属性,请使用DialogResult

请注意,此问题不是特定于C ++ / CLI的-C ++具有相同的作用域规则,因此将具有相同的问题。只是.NET BCL相当广泛地将类型名作为属性名重用(C ++代码可以避免这种情况),因为C#没有此问题。