C# 在HashTable.Add()前面加上一个空字符串可能是“";值不在预期范围内";?
我一辈子都搞不明白为什么遗留代码会这样做:C# 在HashTable.Add()前面加上一个空字符串可能是“";值不在预期范围内";?,c#,hashtable,concatenation,ienumerator,.net-1.0,C#,Hashtable,Concatenation,Ienumerator,.net 1.0,我一辈子都搞不明白为什么遗留代码会这样做: HashSiteMapping.Add(""+sm.SiteNumber, sm.LocationNumber); …当这似乎更合理时: HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber); 我只是耸耸肩,把它塞进这段代码的奇怪之处,但我在这段代码中得到了“值不在预期范围内”,我想知道这是否是问题所在。在更全面的背景下,代码是这样的: IEnumerator en = mFile.Map.Ma
HashSiteMapping.Add(""+sm.SiteNumber, sm.LocationNumber);
…当这似乎更合理时:
HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber);
我只是耸耸肩,把它塞进这段代码的奇怪之处,但我在这段代码中得到了“值不在预期范围内”,我想知道这是否是问题所在。在更全面的背景下,代码是这样的:
IEnumerator en = mFile.Map.Mappings.GetEnumerator();
while (en.MoveNext())
{
SiteMapping sm = (SiteMapping) en.Current;
HashSiteMapping.Add(""+sm.SiteNumber, sm.LocationNumber);
}
…我把它改成这样:
IEnumerator en = mFile.Map.Mappings.GetEnumerator();
while (en.MoveNext())
{
SiteMapping sm = (SiteMapping) en.Current;
if (!HashSiteMapping.Contains(sm.SiteNumber))
{
HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber);
}
}
…但我仍然得到,“值不在预期范围内”您可能希望在调试构建中挂接断言,并监视违反
定义为HashSiteMapping类的“预期范围”的内容--我不熟悉HashSiteMapping。这是自定义类吗?能否提供链接或定义代码 我最好的猜测是,在某些情况下,您的站点映射
站点编号
为null
或为空。在这种情况下,您的原始代码将执行以下操作:
IEnumerator en = mFile.Map.Mappings.GetEnumerator();
while (en.MoveNext())
{
SiteMapping sm = (SiteMapping) en.Current;
if (String.IsNullOrEmpty(sm.SiteNumber))
{
HashSiteMapping.Add(String.Empty, sm.LocationNumber);
}
else
{
HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber);
}
}
请注意,尽管上面的代码没有注释,但所发生的事情仍然比留给您处理的神秘代码更容易理解
您尝试的第二个版本(如下所示)可能会失败,因为SiteNumber和LocationNumber一起创建了一种复合键(我再次猜测,因为我不知道HashSiteMapping的定义)
考虑:
|_SiteNumber__|_LocationNumber_|
| "Warehouse" | "A1" |
| "Warehouse" | "B1" |
| NULL | "Boss'sOffice" |
| NULL |"JanitorCloset" |
| NULL | "RestRoom" |
你当然不想把这些都弄糊涂
希望有帮助。HashSiteMapping是一个简单的哈希表。SiteNumber是一个int。前面加了前缀的空字符串与此无关-这将由编译器消除。错误在哪一行?添加?此外,添加空字符串将使该参数成为字符串,如果没有空字符串,该参数将被键入为int。如果您告诉我们哪行代码给出了该错误,以及它是否是异常(以及具体的异常),这将非常有帮助。@Jim Mischel:“值不在预期范围内”是异常。电话号码?我不知道-我必须缩小异常发生的范围,方法是将MessageBox.Show()贯穿始终,然后查看最后到达的是哪一个,然后我知道它在这之后和下一个MessageBox.Show()之前爆炸。是的,这非常单调和痛苦。“HashSiteMapping”只是一个HashTable对象的名称:public static HashTable HashSiteMapping=new HashTable();
|_SiteNumber__|_LocationNumber_|
| "Warehouse" | "A1" |
| "Warehouse" | "B1" |
| NULL | "Boss'sOffice" |
| NULL |"JanitorCloset" |
| NULL | "RestRoom" |