Вопрос по list, c# – Массив назначения недостаточно длинный?

39

У меня есть класс со следующим методом:

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.

В чем здесь проблема?

Вы все дошли до первопричины этой проблемы? Я сталкиваюсь с чем-то подобным. Klaus Nji
Да, это следующее сообщение (извините за беспорядок):at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable) at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length) at System.Collections.Generic.List'1.CopyTo(T[] array, Int32 arrayIndex) at System.Collections.Generic.List'1..ctor(IEnumerable'1 collection) at MyGame.Player.get_bikesCopy() Geert
Где именно вы получаете исключение? Можете ли вы обновить вопрос с помощью трассировки стека исключений и указать точную строку кода, в которую он был добавлен? Fredrik Mörk
Если вы не решили эту проблему, я полагаю, что проблема может заключаться в том, что вы не закрылиbikes.Add() метод (или, возможно, другой метод List). Это потому, что метод Add не является потокобезопасным в List. В любом случае, надеюсь, это поможет, если кто-то получит такую же проблему Theo

Ваш Ответ

3   ответа
7

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

Детали исключения обсуждаются здесь:Почему в некоторых случаях не работает цикл foreach?

@JamesM Это линия_items = new T[capacity]; в исходном коде для списка & lt; T & gt; (referencesource.microsoft.com/mscorlib/system/collections/…) который имеет все значение.
Не знаю почему, но.ToList() отлично работает противnew List<T>(YourList), который всегда выдает исключение.
Вы не можете использовать LINQ?!?!? Я уволился с работы, как только узнал об этом!
Я не могу использовать LINQ, так как он не входит в белый список моей платформы .... В любом случае, он также не отвечает на мою проблему :) Geert
0

Я столкнулся с той же проблемой и сделал быстрый тест. Я попытался с кодом ниже и не мог получить этот код, чтобы броситьArgumentException: Destination array was not long enough, Но когда я удаляю.ToList() с линии

return allLines.ToList().ToArray();

это немедленно терпит крах.

Это демо-код, и даже 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);
        }
    }
}

Я действительно удивляюсь, почему он не потерпит крах, поскольку список также поддерживается массивом.

74

_bikes не быть потокобезопасным. Как прокомментировано, где-то есть модификация_bikes объект, который не блокируется ».

Это ошибка доли секунды, когда переменнаяbs установлен на размер X, когда размер_bikes измеряется. В следующую долю секунды, когда он собирается заполнить список,_bikes объект увеличился в размере, что дает ошибку.

Итак, пройдитесь по своему коду. Найти все ссылки вашего_bikes объект и убедитесь, что они обработаны потокобезопасно (с замком).

Что ты редактировал ?! Я в замешательстве ... Однако: я люблю велосипеды :-)
Я ужасно сожалею, я случайно нажал на downvote, но на самом деле я хотел, чтобы upvote, и теперь я не могу больше голосовать: - / Извините !!
Все в порядке. Хуже всего, когда вы голосуете и не знаете, почему.
Да, у меня есть «фанат» пару дней назад (18 голосов за 2 минуты) и узнал о боте против серийного отказа. Мне очень нравится этот бот :-) П.С .: На сайте написано, что если вы отредактируете ответ, я снова смогу отменить отрицательное голосование.

Похожие вопросы