딱지. 나는 그 문제를 발견했다. 신경 쓰지 마. 항목이 제거되면 다른 항목으로 대체 될 예정 이었지만 교체가 발생할 수 있기 전에 교체가 발생하지 않았기 때문에 잘못된 항목을 제거한 이벤트가 트리거되었습니다.listBox.Items.Remove가 잘못된 항목을 제거하도록 만들 수있는 원인은 무엇입니까?
두 가지의 주장이 실패 :
var item4 = listBox.Items[4];
var item5 = listBox.Items[5];
listBox.Items.Remove(item5);
Debug.Assert(listBox.Items.Contains(item4), "item4 not found");
Debug.Assert(!listBox.Items.Contains(item5), "item5 still found");
과 :
var item4 = listBox.Items[4];
var item5 = listBox.Items[5];
listBox.Items.RemoveAt(5);
Debug.Assert(listBox.Items.Contains(item4), "item4 not found");
Debug.Assert(!listBox.Items.Contains(item5), "item5 still found");
목록 상자 항목은 사용자 정의 클래스입니다. ListBox는 소유자가 그려집니다.
어설 션 item4 != item5
이 전달됩니다.
+1 그게 아마도 일어날 것입니다. 그리고'! = '연산자는 아마도 과부하가되지 않을 것이기 때문에 참조 평등을 사용합니다. 이것은 왜 item4! = item5' –
을 전달 하는지를 설명합니다.'item4! = item5'는 이것을 반박하는 것으로 보입니다. 나는 어느 쪽의 방법도 무시했다. 두 메소드를 모두 오버로딩하여 항등 여부를 확인하고 항목의 고유 한 속성을 기반으로 해시 코드를 반환하지만 동작은 변경되지 않습니다. –
이미 두 가지 단언을 시도하고 있었지만 단순화를 위해 질문을하지 않았습니다. 두 단정은 여전히 통과됩니다. 이상하게도, 전의 assertions가 item4.GetHashCode()! = item5.GetHashCode()와 같이 계속 유지 되더라도 Remove (item5)를 다시 호출하여 올바른 item5를 제거 할 수 있습니다. –