3

コードに直接ジャンプすると、これが私がやりたいことです。

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

これを試すと、エラーが発生します

size_t から int への変換、データ損失の可能性

int に明示的にキャストせずにこのコードをコンパイルする方法はありますか? 特に LongLength プロパティがあるため、配列をこのサイズに初期化できないのは奇妙だと思います (そして、長さを int としてしか初期化できない場合、int よりも大きい long として長さを取得するにはどうすればよいでしょうか? )。

ありがとう!

PS:本当に size_t である配列を割り当てることは実際的ではないかもしれないという記事を見つけましたが、それは問題ではないと思います。ポイントは、初期化したい長さが size_t 変数に格納されていることです。

4

1 に答える 1

4

マネージ配列はInt32、インデックスとして使用するために実装されていますが、それを回避する方法はありません。より大きい配列を割り当てることはできませんInt32.MaxValue

静的メソッドArray::CreateInstance(Typeと の配列を受け取るオーバーロード) を使用して、結果を適切な実際の配列型 (例: )Int64にキャストできます。渡される値は より大きくてはならないことに注意してください。そして、あなたはまだキャストする必要があります。System::Arrayarray<int>^Int32.MaxValue

したがって、少なくとも 2 つのオプションがあります。いずれかのキャスト:

// 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 に答える