3

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

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

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

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

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

谢谢!

PS:我确实发现这篇文章说分配一个真正 size_t 的数组可能是不切实际的,但我不认为这是一个问题。关键是我想初始化的长度存储在 size_t 变量中。

4

1 回答 1

4

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

您可以使用静态方法Array::CreateInstance(采用 aType和数组的重载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 的实际大小,以免遇到任何上述错误。

于 2012-04-20T07:01:34.793 回答