【问题标题】:Why can I declare const structures in C++/CLI, but not in C#?为什么我可以在 C++/CLI 中声明 const 结构,但不能在 C# 中声明?
【发布时间】: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


【解决方案1】:

您必须通过在参数列表后添加const 来向编译器表明您的函数不会更改对象。

您的函数随后可以在 const 变量上调用,但不能修改其字段。

还要注意一些关键字(包括conststruct)在C#和C++(以及其他基于C的语言)中有不同的含义。

更新

由于 CPP/CLI 不允许在成员函数上使用 const 修饰符,您必须将变量复制到非 const 变量才能调用任何成员函数(在副本上) .

【讨论】:

  • 已经试过了。声明 System::Drawing::Point ToPoint () const; 产生:错误 C3842:'ToPoint': Die Qualifizierer 'const' und 'volatile' für Memberfunktionen von verwalteten Typen werden nicht unterstützt。 (来自 MSDN 的英语原始消息:'function': WinRT 或托管类型的成员函数上的 'const' 和 'volatile' 限定符不受支持)
猜你喜欢
  • 2011-11-02
  • 2011-06-03
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
相关资源
最近更新 更多