2012-04-28 8 views
32

Tôi có một lớp học với các phương pháp sau đây:Mảng đích không đủ dài?

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

Mà làm cho một bản sao của một danh sách khác, private List<Bike> _bikes;

Điều kỳ lạ đã đến rồi, mà tôi nhận được lỗi sau:

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

Vấn đề ở đây là gì?

+0

Trường hợp bạn nhận được ngoại lệ chính xác ở đâu? Bạn có thể cập nhật câu hỏi với dấu vết ngăn xếp ngoại lệ và chỉ ra dòng mã chính xác nơi nó được ném không? –

+0

Có, đó là thông báo sau (xin lỗi vì sự lộn xộn): 'tại System.Array.Copy (mảng nguồnArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean đáng tin cậy) tại System.Array.Copy (Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length) tại System.Collections.Generic.List'1.CopyTo (mảng T [], Int32 arrayIndex) tại System.Collections.Generic.List'1. .ctor (Bộ sưu tập IEnumerable'1) tại MyGame.Player.get_bikesCopy() ' – Geert

+2

Bạn đã từng có được nguyên nhân gốc rễ của vấn đề này chưa? Tôi đang chạy vào một cái gì đó tương tự. –

Trả lời

51

tôi sẽ nói lỗi nằm trong đối tượng _bikes không phải là chủ đề an toàn. Như đã nhận xét, một nơi nào đó có sửa đổi đối tượng _bởi không bị khóa.

Đó là một lỗi thứ hai chia nơi biến bs được thiết lập để một kích thước X khi kích thước của _bikes được đo. Trong lần phân chia thứ hai tiếp theo khi sắp điền vào danh sách, đối tượng _bikes đã tăng kích thước đưa ra lỗi.

Vì vậy, hãy xem lại mã của bạn. Tìm tất cả các tham chiếu về đối tượng _bikes của bạn và đảm bảo chúng được xử lý an toàn bằng ren (có khóa).

+0

Tôi vô cùng xin lỗi, tôi vô tình bấm vào downvote nhưng tôi thực sự muốn upvote và bây giờ tôi không thể bỏ phiếu nữa: -/Xin lỗi !! –

+0

Đó là ok. Điều tồi tệ nhất là khi bạn nhận được bình chọn và không có đầu mối về lý do tại sao. – Wolf5

+0

Vâng, tôi đã có một "fan" vài ngày trước (18 downvotes trong vòng 2 phút) và đã học về bot chống down-overl. Tôi thực sự thích bot đó :-) P.S .: Trang web cho biết, nếu bạn chỉnh sửa câu trả lời, tôi có thể hoàn tác phần tóm tắt lại. –

6

Vâng, bạn có thể thử:

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

Các chi tiết của các ngoại lệ được thảo luận ở đây: Why doesn't a foreach loop work in certain cases?

+1

Tôi không có khả năng sử dụng LINQ, vì nó không nằm trong danh sách trắng của tôi .... Dù sao, nó cũng không trả lời được vấn đề của tôi :) – Geert

+7

Bạn không thể sử dụng LINQ ?!?!? Tôi sẽ bỏ công việc đó ngay khi tôi phát hiện ra điều đó! –

+0

Không chắc chắn lý do tại sao, nhưng '.ToList()' hoạt động tốt so với 'Danh sách mới (Danh sách của bạn)', mà luôn luôn ném một ngoại lệ. –

0

Không thực sự là câu trả lời, thêm nhận xét về nghiên cứu.

Tôi đã gặp sự cố tương tự và đã thực hiện kiểm tra nhanh. Tôi đã thử với mã bên dưới và không thể lấy mã này để ném ArgumentException: Destination array was not long enough. Nhưng khi tôi xóa số .ToList() khỏi dòng

return allLines.ToList().ToArray(); 

nó ngay lập tức bị treo.

Đây là mã demo và thậm chí IDE cho tôi biết, tôi nên xóa cuộc gọi ToList() vì có vẻ như dự phòng.

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); 
     } 
    } 
} 

Tôi thực sự tự hỏi, tại sao nó sẽ không sụp đổ, vì Danh sách cũng được hỗ trợ bởi một mảng.