直接跳到代码,这就是我想要做的事情:
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变量中。
答案 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的实际大小,以免发生任何上述错误。