2012-04-19 85 views
1

跳直奔代码托管数组,这是我想要做什么:创建长/为size_t长度

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

当我尝试,我得到了错误已从size_t

转换int,可能丢失的数据

有没有一种方法可以让我的代码编译而不显式转换为int?我觉得很奇怪,我无法将数组初始化为这个大小,尤其是因为存在LongLength属性(以及如何将长度变为long - 比int更大 - 如果只能将长度初始化为int? )。

谢谢!

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

回答

2

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

你可以使用静态方法Array::CreateInstance(采用一个TypeInt64阵列中的过载),然后投所得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的实际大小,以免遇到任何提及的错误。