현재 사용 중인 ChartFX의 버전을 업그레이드 하는 작업을 진행하고 있습니다.
if(chartAll.AxisX.Labels[value].Equals(""))
{
......
}
이러한 코드가 있는데 버전 업그레이드를 하고 나니 여기에서 NullReferenceException이 발생하더라고요.
확인을 해보니 Labels의 형식이 ICollection => IList<>로 변경이 되었네요.
우선 코드는 아래와 같이 수정을 하고 기능 테스트를 진행하고 있는데
if(chartAll.AxisX.Labels[value] is null)
{
......
}
존재하지 않는 객체에 접근할 때 ICollection과 IList<T>에 차이가 있는지 궁금합니다!
혹은 Generic 때문에 발생하는 문제인지 … 답변 부탁드립니다. 감사합니다.
1개의 좋아요
suwoo
8월 9, 2023, 2:37오전
2
IList<T>
는 ICollection<T>
상속 받은, 좀 더 구체적인 인터페이스입니다 .
그래서 ,IList<T>
를 구현하는 클래스 및 그의 인스턴스는 ICollection<T>
로 변환이 되지만
그 반대는 변환이 실패해서 오류를 발생하거나 null을 리턴 할 수도 있겠지요.
2개의 좋아요
chartAll.AxisX.Labels[value]. //...
만약 위 코드에서 컴파일 에러가 나지 않았다면 , Lables 는 IList 이지, ICollection 일리가 없습니다.
왜냐하면 인덱서 [int index] 는 ICollection 이 아닌, IList 의 멤버이기 때문입니다.
만약, ICollection 이 맞다면, 없는 멤버를 호출하기 때문에, 컴파일러는 정의를 찾을 수 없다는 에러를 보여주고 컴파일을 하지 않을 것입니다.
Null 에러가 났다면,
chartAll 이 null 이거나,
AsisX가 null 이거나,
Labels 가 null 이거나,
Lebels[value] 가 null 이거나 입니다.
만약 아래의 가드 조건문에 의해 null 에러가 사라졌다면,
if(chartAll.AxisX.Labels[value] is not null)
Lebels[value] 가 null 이어서 에러가 난 것입니다.
참고로 IEnumerable, ICollection, IList 의 관계는 아래의 글에 자세히 소개되어 있습니다.
When To Use IEnumerable, ICollection, IList And List - Claudio Bernasconi
5개의 좋아요
이곳 편집기에서 말씀이시죠? ICollection\<int\>
이렇게 하시면 됩니다.
5개의 좋아요
이전 버전의 ICollection 이라고 했던 Labels는 정확히는 ICollection을 상속하는 LabelCollection 클래스더라고요.
ChartFX에서 만든 제공하는 형식이고, 여기에 인덱서 [int index]가 멤버 변수로 선언되어 있었습니다.
제가 처음에 설명을 잘 못한 것 같은데 이야기하신 대로 Labels[value] 가 null인 상황이 맞습니다.
다만 Labels가 LabelCollection 형식일 때 Labels[value] = “” 이었는데, Labels가 IList 형식으로 변경되고 Labels[value] = null 이 되어서
이 이유가 혹시 IList와 ICollection의 타입 차이에 기인하는지 여쭈어 본 것이었습니다.
혹시 어떻게 생각하시는지요…?
2개의 좋아요
그건 아닌 것 같습니다. 좀 더 정확한 것은 LabelCollection의 indexer 구현을 살펴보면 될 듯 합니다.
3개의 좋아요
그렇군요 감사합니다! 그런데 LabelCollection의 indexer 구현은 dll로 제공되어서 JustDecompile 로도 열리지 않는군요
혹시 다른 방법이 있을까요?
2개의 좋아요
컬렉션 형식의 문제같지는 않아 보입니다.
인덱서는 거의 대부분 getter이고, IList 의 인덱서 또한 getter 입니다.
에러가 IndexOutOfRange 가 아니기에, 컬렉션에는 null 이 분명히 들어 있음을 확정할 수 있습니다.
따라서, 문제의 코드는 null 값을 get 한 것 뿐이라 정상적인 동작입니다.
LabelCollection 에 아래와 같은 코드가 숨어 있을 수도 있구요.
if(label == null)
label = "";
그래서, null을 set 한 코드를 찾는 게 문제 해결 방법일 것 같습니다.
4개의 좋아요