2014-03-26 5 views
0

대 나는 다음과 같은 클래스가 있습니다. 왜 다음 문장들은 동등하지 않은가? 새로운 것을 사용하면 모든 것이 잘 작동하지만 문자열을 사용하면 키를 찾을 수 없습니다.암시 Converstion 새로운

ChArray LINE_LEN = new ChArray("lineLen"); 
ChArray LINE_LEN = "lineLen" 

암시 적 작업은 새로운 ChArray를 반환하므로 왜 작동하지 않습니까?

일을 단순하게하기 위해 전체 수업을 게시하지는 않습니다. 새로운 방법을 사용하면이 작업이 가능합니다.

+0

가 디버깅을 해봤를 사용하는 경우는 KeyNotFoundException을받을 수 있습니까? – wudzik

+0

은 – Ehsan

+0

@ wudzik을 컴파일하는 코드를 게시합니다. 사전에 액세스하려고하면 오류가 발생합니다. – David

답변

2

여기에 표시된 코드에는 문제가 없습니다.

문제는 사용자 정의 클래스의 인스턴스를 사전의 키로 사용하려면 Equals and GetHashCode을 적절하게 오버로드해야한다는 것입니다. 그들은 (물론 그렇지 않은) 같은 객체가 실제로있는 경우

[A 클래스] 기본 비교 확인합니다 : LordTakkera으로

그것을 넣어.

참고 :이 두 기능의

Object.Equals("foo", "foo"); // returns true 

그러나

Object.Equals(new ChArray("foo"), new ChArray("foo")); // returns false 

적절한 재정의 올바른 결과를 제공 할 것입니다.


해야 일 :

public class ChArray { 
    // (as you have it) 

    public override bool Equals(System.Object obj) 
    { 
     // If parameter cannot be cast to ChArray return false: 
     ChArray p = obj as ChArray; 
     if ((object)p == null) 
     { 
      return false; 
     } 

     // Return true if the fields match: 
     return m_str == p.m_str; 
    } 

    public bool Equals(ChArrayp) 
    { 
     // Return true if the fields match: 
     return m_str == p.m_str; 
    } 

    public override int GetHashCode() 
    { 
     return m_str.GetHashCode(); 
    } 
} 
+0

기본 비교 자 (default comparer)는 실제로 동일한 객체인지 확인합니다 (물론 그렇지 않은 경우). 이 두 함수의 적절한 재정의는 올바른 결과를 제공합니다. – BradleyDotNET

+0

특히 코드 예제를 이용해 주셔서 감사합니다. 호기심에서 동성애가 왜 필요한가요? – David

+1

'ChArray' (클래스 이름 뒤에 공백이 누락 됨)를 사용하는'Equals'의 오버로드는'p'가'null'인지를 검사 할 수 있습니다. 사실, 두 오버로드가있을 때,'object' 버전은 간단히'return Equals (obAr as ChArray); '이어야하고, 특정 과부하에서 널 체크가 발생합니다. 이 특정 오버로드를 선택했기 때문에'IEquatable '을 구현하는 것을 고려하십시오. 특정 과부하에서'GetType() == p.GetType()'을 검사하는 _or_ 클래스를 씰링하는 것을 고려하십시오. –

1

어쩌면 당신은 당신의 클래스 ChArray에 GetHashCode()와 같음()를 오버라이드 (override) 할 필요가? 키를 비교하는 데 사용됩니다.

1

그냥 다른 답변에 추가하십시오. 제 질문은 아직 대답하지 않은 질문 Using new, everything works just fine, but using a string, I get a key not found.입니다.

당신이

var key = new ChArray("lineLen"); 

dictionary.Add(key, someValue); 
var value = dictionary[key]; 

key 여전히 같은 객체를 사용하면 당신은 Equals 방법을 무시하지 않았기 때문에 참조 비교되는 사용 object.Equals. 당신이

ChArray key = "lineLen"; 

dictionary.Add(key, someValue); 
var value = dictionary[key]; 

를 사용하는 경우

여전히 일을해야한다.

하지만

ChArray key = "lineLen"; 

dictionary.Add(key, someValue); 
var value = dictionary["lineLen"]; 

또는

ChArray key = "lineLen"; 

dictionary.Add(key, someValue); 
ChArray key1 = "lineLen"; 
var value = dictionary[key1];