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)
也可以!
这些命名空间的工作方式我缺少什么?我想避免必须完全限定我正在编写的所有代码,但是由于我应该已经导入了所需的名称空间,所以我无法弄清楚我在做什么错。
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#没有此问题。