Ошибка: InvalidOperationException: out of sync

121
18 августа 2019, 15:00

Есть код:

     Dictionary<Rigidbody, float> cubes_ = new Dictionary<Rigidbody, float> ();
...          
               foreach( var cube in cubes_.Keys){
                    if (cube.gameObject.layer != LAYERS_AND_TAGS.D_2)
                        cube.AddForce ( -Physics.gravity * cube.mass );
                    else{
                        if (DCB.INSTANCE.DCC.IS_GROUNDED == false) {
                            cube.AddForce ( -Physics.gravity * cube.mass * cubes_[cube] );
                            cubes_[cube] = Mathf.Clamp01 ( cubes_[cube] + 5f * Time.fixedDeltaTime );
                        } else
                            cubes_[cube] = 0f;
                    }
                }

cubes_ содержит 3 обекта. При первом заходе в for cube содержит null, при втором первую переменную из cubes_ (переход в cube.AddForce ( -Physics.gravity * cube.mass ))

При третьем заходе, вторая переменная приводит к выполнению: cubes_[cube] = 0f; И все, дальше ошибка:

InvalidOperationException: out of sync System.Collections.Generic.Dictionary2+Enumerator[UnityEngine.Rigidbody,System.Single].VerifyState () (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:912) System.Collections.Generic.Dictionary2+Enumerator[UnityEngine.Rigidbody,System.Single].MoveNext () (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:835) System.Collections.Generic.Dictionary`2+KeyCollection+Enumerator[UnityEngine.Rigidbody,System.Single].MoveNext () (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:1028) Magnit.FixedUpdate () (at Assets/Units/Rooms/P_3/Maп/Scripts/Mag.cs:41)

В чем может быть причина ошибки?

Answer 1

Это

При первом заходе в for cube содержит null,

противоречит строчке

if (cube.gameObject.layer ...

Ну ладно.

Вы итерируете по ключам словаря, используя энумератор. Внутри цикла Вы меняете свойство объекта-ключа, что приводит к изменению значения, возвращаемого его методом GetHashCode. После этого Вы обращаетесь к словарю - устанавливаете значение по изменившемуся ключу. Это приводит к изменению коллекции, по которй Вы итерируете, что не допускается.

foreach(var cube in new List<Rigidbody>(cubes_.Keys)){
READ ALSO
Путь к компилятору c#. JetBrains Rider

Путь к компилятору c#. JetBrains Rider

Не могу отыскать компилятор в JetBrains RiderПрошу указать путь к папке в которой он находится

118
Выдает ошибку во всех проектах Visual Studio

Выдает ошибку во всех проектах Visual Studio

Создаю проект за проектом и вот этоЕррор за еррором

126
Зависимость textbox от combobox

Зависимость textbox от combobox

Необходимо реализовать программу Которая рассчитывает например окружность, трапецию и параболу

96
&ldquo;общение&rdquo; со строкой таблицы [дубликат]

“общение” со строкой таблицы [дубликат]

На данный вопрос уже ответили:

108