2010-12-27 11 views
1

나는 Vector3을 사용하고 있습니다. - X, Y, 을 사전에 키로 포함하고 있습니다. 사전 (myDic)에 값 (0,0,0)을 가진 Vector3을 이미 추가했다고 가정 해 보겠습니다.사전 <Key,Value> - 키는 수업 일 수 없습니까?

Vector3 vec = new Vector3(0,0,0); 
if (!myDic.ContainsKey(vec)) 
{ 
    //Should never reach here. 
} 

나는 또한 Vector3 클래스 ==!=에 대한 과부하 연산자를 만들어 :

그런 다음 나는 이것이 않습니다.

어쨌든 도달합니다. 사전에 대한 키로 Vector3과 같은 객체를 사용할 때 문제가 있습니까?

+0

왜 거기에 도달해서는 안되나요? 그 벡터를 사전에 추가 한 적이 있습니까? 그것은 그 것처럼 보이지 않습니다. – tster

+0

나는 그것을 이미 추가했다고 언급했다. –

+2

'Equals'와'GetHashCode'를 오버라이드 했습니까? –

답변

4

당신이 잘못을 구현하고 있습니다 : 한마디로

을, 당신은 EqualsGetHashCode를 구현해야합니다는 사용되지 않기 때문에 ==!= 여기에 관련이 있습니다.

==!= 사용하지 않는 이유는 그들이 모든 사업자처럼, 이 아닌 가상하고 IDictionary<K,V>에서 K의 "제약"object (지정되지 않은, 정말) 것입니다. 그러므로 EqualsGetHashCode과 같은 모든 객체 (모든 하위 유형 object 포함)에 유효한 (가상) 메소드 만이 여기에서 다형성 방식으로 사용될 수 있습니다.

테스트 케이스의 작동 예제는 Example of Dictionary collection with custom class as key?을 참조하십시오.

해피 코딩.

6

클래스 내에 GetHashCodeEquals을 덮어 써야합니다. 사전은 두 가지를 조합하여 작동하며 첫 번째 검사는 해시이고 클린 처는 Equals입니다. ==에 대한 맞춤 구현을 제공하는 것은 사전에 대해 아무 것도하지 않을 것입니다.

클래스 자체에서 이러한 메서드를 재정의 할 수 없거나이를 사용하지 않으려는 경우 다른 방법은 IEqualityComparer<YourClass>을 구현하고 사전 생성자에서 구현 인스턴스를 제공하는 것입니다. 이 구현 내에서 앞서 언급 한 메소드에 대한 코드를 제공하게 될 것입니다.

관련 문제