Я пытаюсь получить доступ к члену структуры .NET, но компиляция не выполняется даже для этого простого примера:
.час:
using namespace System::Drawing;
namespace MyNamespace{
public ref class MyClass{
public:
MyClass();
static const System::Drawing::Size MinimumSize = System::Drawing::Size(20,20);
}
}
.cpp:
#include "MyInclude.h"
MyClass::MyClass(){
int i = MinimumSize.Width;
// .....
}
Оператор, который присваивает MinimumSize.Width локальной переменной i, не компилируется:
Присваивание компилируется без ошибок, когда я удаляю "const" в объявлении, но я хочу, чтобы значение оставалось общедоступным и доступным только для чтения.
Может кто-нибудь подскажет, как это указать?
«Классификаторы типов», на которые он жалуется, - это const
. Получатель свойства Width не является константным, ни один из методов .NET Framework не является константными функциями. Основное несоответствие импеданса между C++ и виртуальной машиной .NET. Правильное ключевое слово - initonly
. Однако в этом конкретном случае это вызывает новую диагностику, на этот раз предупреждение. Тема это Q + A.
@Swordfish: У меня есть веская причина сделать это на C++ / CLI. Я пишу DLL, которая должна вести себя как стандартная DLL для приложения C# и, использующего интерфейсы DirrectWrite / DirectX. Все еще глуп? Вы можете подумать еще раз.
Да еще глупо. Не зря существуют библиотеки вроде SharpDX.
@Swordfish: Делай по-своему. Вы должны прочитать это.
Я только что попробовал: 'initonly' выдает сообщения два, когда я пытаюсь выделить MinimumSize.Width на 'i':
плюс сообщение
Я использую это решение:
int i = (( System::Drawing::Size)MinimumSize).Width;
Это приведение избавляется от 'const', компилируется без каких-либо ошибок / предупреждений и выполняется, как ожидалось. Или это перебор?
С уважением, PaulTheHacker
Мне стыдно! Извините - приведение типа настолько простое, что я даже не подумал об этом. Но работает нормально. Спасибо.
Использование C++ / CLI для WindowsForms - это глупо. Используйте C++ / cx или C#.