通常认为C ++ / CLI的initonly
相当于C#的readonly
关键字。但是,以下内容:
ref class C {
C();
void Method();
initonly array<int>^ m_array;
};
C::C() {
m_array = gcnew array<int>(10);
}
void C::Method() {
m_array[0] = 5; // Fails with C3893
}
完整错误为"'C::m_array': l-value use of initonly data member is only allowed in an instance constructor of class 'C'"
。
错误消息似乎很奇怪,因为我没有使用m_array作为赋值的目标,这相当于编写
m_array->SetValue(5, 0);
偶然编译好并做同样的事情。
这在C ++ / CLI或设计中是否存在错误?顺便说一句,使用Array::SetValue
与使用访问者相比,是否存在性能损失?
报告了类似(但不完全相同)的案例,并且显然是作为VS2008的错误提交的:http://bytes.com/topic/net/answers/847520-initonly-but-not-bug-vc-2008-clr。我正在使用Visual Studio 2012。
答案 0 :(得分:2)
是的,这是一个错误。它强制执行.NET类型系统没有暗示的内容,并且强制执行无效。
但是不要使用Array::SetValue
,这涉及拳击并且不是类型安全的。你可以这样做:
auto array = m_array; // another handle to same array
array[0] = 5;