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);
    }
}
请注意,尽管上面的代码没有注释,但所发生的事情仍然比留给您处理的神秘代码更容易理解

您尝试的第二个版本(如下所示)可能会失败,因为SiteNumberLocationNumber一起创建了一种复合键(我再次猜测,因为我不知道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"   |