ArgumentException:字典中已存在具有相同键的元素

时间:2017-10-26 20:11:08

标签: c# unity3d

在我的项目中,我得到了两个场景' Opening' '主&#39 ;.

如果在一段时间内没有完成任务或完成任务, 它将返回Opening场景并可以重新开始。

它有用,去开场景 - >主场景
并转到主场景 - >开幕式

然而'主要场景 - >开幕式#39;当我再次尝试去主场景时, 它显示了那些错误。

ArgumentException:字典中已存在具有相同键的元素。 System.Collections.Generic.Dictionary 2[System.Int32,System.Collections.Generic.Dictionary 2 [KeyDelayData + Delay,UnityEngine.Sprite]]。添加(Int32键,System.Collections.Generic.Dictionary`2值)(在/ Users / builduser / buildslave / mono /build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:404) Note.Init()(在Assets / Scripts / Music / Note.cs:22) ManagerChat.Awake()(在Assets / Scripts / Chatting / ManagerChat.cs:315)

ArgumentException:字典中已存在具有相同键的元素。 System.Collections.Generic.Dictionary`2 [System.Int32,UnityEngine.AudioClip] .Add(Int32 key,UnityEngine.AudioClip value)(at / Users / builduser / buildslave / mono / build / mcs / class / corlib / System。 Collections.Generic / Dictionary.cs:404) SoundManager.Awake()(在Assets / Scripts / Music / SoundManager.cs:16)

对我来说,这看起来像是一个重置变量问题,但我不知道它的含义 我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:1)

您正在尝试向Dictionary添加退出键。

来自 315 行上Awake脚本的ManagerChat函数中的第一个错误。

来自 16 行上Awake脚本的SoundManager函数中的第二个错误。

解决方案:

1 Dictionary.Clear()应该这样做,但是如果您不想清除它们,请在添加Dictionary之前检查该密钥是否已经在Dictionary.Add中{1}}功能:

让我们说这是你的代码:

Dictionary<int, Sprite> imageDict = new Dictionary<int, Sprite>();
int keyToAdd = 1;
imageDict.Add(keyToAdd, new Sprite());

将其更改为:

Dictionary<int, Sprite> imageDict = new Dictionary<int, Sprite>();
int keyToAdd = 1;
//Add only if key does not exist
if (!imageDict.ContainsKey(keyToAdd))
{
    imageDict.Add(keyToAdd, new Sprite());
}

2 。另一种方法是使用索引([])作为更改密钥。这样做涉及Dictionary.Add函数。

Dictionary<int, Sprite> imageDict = new Dictionary<int, Sprite>();
int keyToAdd = 1;
imageDict.Add(keyToAdd, new Sprite());

应该是:

Dictionary<int, Sprite> imageDict = new Dictionary<int, Sprite>();
int keyToAdd = 1;
imageDict[keyToAdd] = new Sprite();

答案 1 :(得分:0)

我通过使用DictionaryValue.Clear()修复了两者;

这是关于我认为的遗留对象和精灵。