Dictionary의 Key로 Class나 struct 가 사용될 때, Dictionary는 GetHashCode() 함수를 사용하게 되는데, 만약 Key로 사용하고 있는 Class의 인스턴스가 변경되는 경우 GetHashCode()의 결과도 바뀌게 되기 때문이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public struct H { public int a; public H(int _a) { a = _a; } } [Test] public void HashCodeTest() { var h = new H(0); Debug.Log($"HashCode = {h.GetHashCode()}"); h.a = 100; Debug.Log($"HashCode = {h.GetHashCode()}"); h.a = 1; Debug.Log($"HashCode = {h.GetHashCode()}"); } |
위의 코드를 실행하면
HashCode = 498689296
HashCode = 498689396
HashCode = 498689297의 결과가 출력된다.
EqualityComparer 를 사용할 것이 아니라면 수정될 만한 인스턴스는 Dictionary 의 Key로 사용하지 말자
C# Dictionary<> and mutable keys