2013-04-02 4 views
2

나는 내 인생은 레거시 코드가이 일을하는 이유를 알아낼 수 없기 :빈 문자열을 HashTable.Add() 앞에 붙이면 "value가 예상 범위 내에 있지 않음"의 원인 일 수 있습니까?

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;  
    if (!HashSiteMapping.Contains(sm.SiteNumber)) 
    { 
     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); 
} 

... 그리고 나는이 그것을 변경 : 풀러 컨텍스트에서 코드이 있었다 내가 famili하지 오전 HashSiteMapping이

+0

HashSiteMapping은 간단한 HashTable입니다. SiteNumber는 int입니다. –

+0

앞에 추가 된 빈 문자열은 컴파일러와 함께 처리되지 않습니다. –

+2

오류가 발생한 행은 무엇입니까? 추가? 또한 빈 문자열을 추가하면 매개 변수가 int로 입력되지 않고 해당 매개 변수가 문자열로 변경됩니다. –

답변

1

을 그 수업에 대한 예상 범위 ""

+0

"HashSiteMapping"은 단순히 HashTable 객체의 이름입니다. public static Hashtable HashSiteMapping = new Hashtable(); –

0

당신은 디버그 빌드에서 어설에서 후크 다음과 같이 정의 뭔가를 위반하는 값을보고 할 수 있습니다 " ar with HashSiteMapping. 이 클래스는 맞춤 클래스입니까? 링크를 제공하거나 코드를 정의 할 수 있습니까?

가장 좋은 추측은 사이트 맵SiteNumbernull이거나 비어있는 경우입니다. 위의 코드 댓글이 없습니다에도 불구하고

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); 
    } 
} 

공지 사항, 무엇에가는 것은 당신이 일 왼쪽 된 비밀 코드를보다 이해하기 위해 여전히 쉽게 :이 경우, 원래의 코드는 다음과 같은 일을 할 것입니다 와. 나는 HashSiteMapping을 모르기 때문에

SiteNumberLocationNumber 함께 모두 복합 키의 유형을 생성하기 때문에 실패 할 수 당신이 시도 2 ​​차 버전 (아래 그림) (다시 내가 추측하고있어 정의)

while (en.MoveNext()) 
{ 
    SiteMapping sm = (SiteMapping) en.Current;   
    if (!HashSiteMapping.Contains(sm.SiteNumber)) 
    { 
    HashSiteMapping.Add(sm.SiteNumber, sm.LocationNumber); // What if LocationNumber has not been included yet? 
    } 
} 

고려 :

|_SiteNumber__|_LocationNumber_| 
| "Warehouse" |  "A1"  | 
| "Warehouse" |  "B1"  | 
|  NULL | "Boss'sOffice" | 
|  NULL |"JanitorCloset" | 
|  NULL | "RestRoom" | 

당신은 확실히 그 모든 것을 혼란스럽게하고 싶지 않을 것입니다!

희망이 있습니다.

관련 문제