я уже нашел полезные ответы, почему это не должно быть вообще возможно:
Why does C# limit the set of types that can be declared as const?
Why can't structs be declared as const?
Первый из них имеет подробный ответ, который я до сих пор перечитывать несколько раз, пока я полностью не получить Это.
У второго есть очень простой и понятный ответ (например, ) конструктор может что-то сделать, поэтому его нужно было запустить и оценить во время компиляции ').
Но оба относятся к C#.Почему я могу объявлять конструкции const в C++/CLI, но не в C#?
Однако, я использую C++/CLI и имеют
value class CLocation
{
public:
double x, y, z;
CLocation (double i_x, double i_y, double i_z) : x(i_x), y(i_y), z(i_z) {}
CLocation (double i_all) : x(i_all), y(i_all), z(i_all) {}
...
}
, где я могу легко создать
const CLoc c_loc (1,2,3);
, который на самом деле является неизменной, что означает 'сопзЬ'.
Почему?
CLocation
кроме того, имеет функцию
System::Drawing::Point CLocation::ToPoint()
{
return System::Drawing::Point (x_int, y_int);
}
, который хорошо работает на CLocation
, но не на const CLocation
. Я думаю, что это связано с ограничением в C# (известно из ссылок выше), которое, вероятно, происходит от базового IL, поэтому C++/CLI зависит от этого ограничения таким же образом.
Это правильно?
Есть ли способ запустить эту функцию-член на const CLocation
?
Функция ToPoint() является нарушением const, она не является функцией const. C++/CLI поддерживает const, когда это возможно, это несовершенно, потому что метаданные .NET не позволяют выразить его везде, где он действителен в C++. Как и функция, [modopt], которую он должен использовать, недействителен для методов. Вместо этого используйте 'initonly'. –