2012-04-19 84 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的實際大小,以免遇到任何提及的錯誤。