【发布时间】:2016-09-18 18:05:57
【问题描述】:
我已经找到了有用的答案,为什么根本不可能:
Why does C# limit the set of types that can be declared as const?
Why can't structs be declared as const?
第一个有一个详细的答案,我仍然需要重新阅读几次,直到我完全理解它。
第二个有一个非常简单明了的答案(例如'构造函数可能会做任何事情,所以它必须在编译时运行和评估')。
但两者都引用 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);
这确实是不可变的,意思是'const'。
为什么?
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。
标签: c# struct c++-cli constants value-type