首页 新闻 赞助 找找看

一个Dictionary的怪问题

0
悬赏园豆:20 [已关闭问题]
<P>程序代码如下:</P> <P>private IDictionary&lt;string, BtsClass&gt; btsClassList = new Dictionary&lt;string, BtsClass&gt;();</P> <P>&nbsp;BtsClass tempClass = null;<BR>&nbsp;if (!btsClassList.Keys.Contains(btsName))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempClass = new BtsClass(btsName, 15);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempClass.MaginDelegate += new MaginDelegate(BtsClass_MaginDelegate);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; btsClassList[btsName] = tempClass;//这个地方,出现错误。。。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempClass = btsClassList[btsName];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR></P> <P>如上的代码,在标著的地方,出现了这样的错误:</P> <P>System.IndexOutOfRangeException: 索引超出了数组界限。<BR>&nbsp;&nbsp; 在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)<BR>&nbsp;&nbsp; 在 System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value)</P> <P>&nbsp;</P> <P>实在是搞不明白,怎么会出现如上的错误....</P> <P>请各位老大帮忙看看.</P> <P>&nbsp;</P>
问题补充: 反编译查看了下Directory的代码: btsClassList.Add(btsName,tempClass); 与 btsClassList[btsName] = tempClass; 最终的不同在于调用 Insert(TKey key, TValue value, Boolean add) 这个方法传递的参数不同. 前一种方法的Boolean add 为true; 后一种方法的Boolean add 为false; 而唯一用到这个 参数的地方 只有一处: for (int i = this.buckets[index]; i >= 0; i = this.entries[i].next) { if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key)) { if (add) { ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate); } this.entries[i].value = value; this.version++; return; } } 看了下,不管用哪种方法,似乎还是会存在 错误的可能.... 索引超出数组界限....看见这个问题的时候,最开始以为btsClassList[btsName] = tempClass; 这样使用,当空间不够的时候,没有重新申请空间 才会导致 有这样的错误. 看了下源代码,实际上当 栈间不够的时候,有重新在分配的过程........ //2008-07-04 18:49:00 呵呵,产生这样的错误,最终可能在于: 1:程序 多线程 2:Directory 不是线程安全的...... 参考: 1:http://forums.msdn.microsoft.com/zh-CN/netfxbcl/thread/c8a83d23-a62e-4e37-a902-8e229bf3c31f/ 2:http://forums.msdn.microsoft.com/zh-CN/csharpgeneral/thread/283a0e50-749e-43de-9f3c-6af314ff31be/
颜昌钢的主页 颜昌钢 | 初学一级 | 园豆:150
提问于:2008-07-04 15:05
< >
分享
其他回答(1)
-1
btsClassList[btsName] = tempClass;//这个地方,出现错误。。。 老兄JS写多了,入戏太深了吧 .Add(
Dev.Hong | 园豆:415 (菜鸟二级) | 2008-07-04 15:59
-1
问题解决如楼上所说 IDirectory支持这么用,但是Directory不允许,如果声明IDirectory是Hashtable的话就可以这么用。
玉开 | 园豆:8822 (大侠五级) | 2008-07-04 16:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册