创建长/ size_t长度的托管数组

时间:2012-04-19 09:11:41

标签: c++-cli

直接跳到代码,这就是我想要做的事情:

size_t len = obj->someLengthFunctionThatReturnsTypeSizeT();
array<int>^ a = gcnew array<int>(len);

当我尝试这个时,我收到了错误

  

从size_t转换为int,可能会丢失数据

有没有办法可以在没有显式转换为int的情况下编译此代码?我发现奇怪的是我无法将数组初始化为这个大小,特别是因为有一个LongLength属性(如果你只能将长度初始化为int,你怎么能得到一个long长度大于int的长度? )。

谢谢!

P.S。:我确实发现this article表示分配一个真正的size_t的数组可能是不切实际的,但我不认为这是一个问题。关键是我想要初始化的长度存储在size_t变量中。

1 个答案:

答案 0 :(得分:2)

使用Int32作为索引实现托管数组,没有办法解决这个问题。您无法分配大于Int32.MaxValue的数组。

您可以使用静态方法Array::CreateInstance(带有Type和数组Int64的重载),然后将生成的System::Array转换为适当的实际值数组类型(例如array<int>^)。请注意,传递的值不得大于Int32.MaxValue。你仍然需要施展。

所以你至少有两个选择。铸造:

// Would truncate the value if it is too large
array<int>^ a = gcnew array<int>((int)len);

或者这个(不需要转换len,但是CreateInstance的结果):

// Throws an ArgumentOutOfRangeException if len is too large
array<int>^ a = (array<int>^)Array::CreateInstance(int::typeid, len);  

就个人而言,我发现第一个更好。您仍然可能需要检查len的实际大小,以免发生任何上述错误。