无法分配给initonly数组的元素?

时间:2014-08-19 19:29:41

标签: c++-cli

通常认为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。

1 个答案:

答案 0 :(得分:2)

是的,这是一个错误。它强制执行.NET类型系统没有暗示的内容,并且强制执行无效。

但是不要使用Array::SetValue,这涉及拳击并且不是类型安全的。你可以这样做:

auto array = m_array; // another handle to same array
array[0] = 5;