2012-04-28 17 views
32

私は次のメソッドを持つクラスがあります:別のリストのコピーを作成します宛先の配列が長すぎますか?

public List<Bike> bikesCopy 
{ 
    get 
    { 
     List<Bike> bs; 
     lock (_bikes) bs = new List<Bike>(_bikes); 
     return bs; 
    } 
} 

を、private List<Bike> _bikes;

奇妙なことが、今、私は次のエラーを取得することを、次のとおりです。

Destination array was not long enough. Check destIndex and length, and the array's lower bounds.

ここで問題は何ですか?

+0

正確に例外はありますか?例外スタックトレースで質問を更新し、スローされる正確なコード行を指摘できますか? –

+0

はい、次のメッセージです(混乱のために申し訳ありません)。 'System.Array.Copy(配列sourceArray、Int32 sourceIndex、Array destinationArray、Int32 destinationIndex、Int32 length、Boolean reliable) at System.Array.Copy System.Collections.Generic.List'1.CopyTo(T [] array、Int32 arrayIndex) (System.Collections.Generic.List'1の配列sourceArray、Int32 sourceIndex、array destinationArray、Int32 destinationIndex、Int32 length) .ctor(IEnumerable'1 collection) at MyGame.Player.get_bikesCopy() ' – Geert

+2

この問題の根本的な原因は何ですか?私は似たようなものに走っています。 –

答えて

51

を私はエラーが_bikesは、スレッドセーフでないオブジェクトであると言うでしょう。コメントされているように、ロックされていない_bikesオブジェクトの変更があります。

_bikesの大きさを測定する場合、可変BSがサイズXに設定されてスプリット第2のエラーです。次の2分の1秒でリストを埋めるようになると、_bikesオブジェクトのサイズが大きくなり、エラーが発生します。

コードを確認してください。 _bikesオブジェクトのすべての参照を検索し、スレッドセーフであることを確認してください(ロックあり)。

+0

私はひどく申し訳ありません、私は誤ってdownvoteをクリックしましたが、私は実際にupvoteしたい、今私はもう投票を断ることはできません: - /申し訳ありません! –

+0

これは問題ありません。最悪の理由は、あなたが投票してダウンし、理由を知る手がかりがないときです。 – Wolf5

+0

ええ、私は数日前に "ファン"(2分以内に18 downvotes)を取得し、逆シリアルdownvotingボットについて学んだ。私はそのボットが本当に好きです:-) P .:ウェブサイトによれば、回答を編集すると、私は下降票を元に戻すことができます。 –

6

さてあなたは試みることができる:

using System.Linq; //ToList() is an extension function defined here 
... 
lock(_bikes) 
    return _bikes.ToList(); 

の例外の詳細はここで議論されていますWhy doesn't a foreach loop work in certain cases?

+1

私のフレームワークでホワイトリストに載っていないのでLINQを使用することができません....とにかく、私の問題にも答えることはできません:) – Geert

+7

LINQ ?!?!?私はそれを見つけたら直ちにその仕事をやめるだろう! –

+0

理由はわかりませんが、 '.ToList()'は 'new List (YourList)'と比べて優れています。常に例外をスローします。 –

0

実際の回答ではなく、より多くの研究コメントです。

私は同じ問題に遭遇し、迅速なテストを行いました。 以下のコードで試したところ、ArgumentException: Destination array was not long enoughを投げるためにこのコードを取得できませんでした。しかし、私はラインから

return allLines.ToList().ToArray(); 

.ToList()を削除すると、それはすぐにクラッシュします。

これはデモコードであり、IDEでも私には冗長であるようにToList()呼び出しを削除する必要があります。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main() { 

      List<string> thelist = new List<string>(); 

      Thread producer = new Thread(() => { 
       while (true) { 
        thelist.Add("a" + DateTime.Now); 
       } 
      }); 

      Thread transformer = new Thread(() => { 
       while (true) { 
        string[] thearray = thelist.ToList().ToArray(); 
        Console.WriteLine(thearray.Length); 
       } 
      }); 
      producer.Start(); 
      transformer.Start(); 
      Console.ReadKey(true); 
     } 
    } 
} 

それがクラッシュしないだろう、なぜリストはまた、配列によって補助されるように私は本当に、不思議。

関連する問題