IList, ICollection 접근 시 NULL

현재 사용 중인 ChartFX의 버전을 업그레이드 하는 작업을 진행하고 있습니다.

if(chartAll.AxisX.Labels[value].Equals(""))
{
   ......
}

이러한 코드가 있는데 버전 업그레이드를 하고 나니 여기에서 NullReferenceException이 발생하더라고요.
확인을 해보니 Labels의 형식이 ICollection => IList<>로 변경이 되었네요.

우선 코드는 아래와 같이 수정을 하고 기능 테스트를 진행하고 있는데

if(chartAll.AxisX.Labels[value] is null)
{
   ......
}

존재하지 않는 객체에 접근할 때 ICollection과 IList<T>에 차이가 있는지 궁금합니다!
혹은 Generic 때문에 발생하는 문제인지 … 답변 부탁드립니다. 감사합니다.

1개의 좋아요

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개의 좋아요

헐… 지금까지 아래처럼 입력했는데…

&lt;int>
4개의 좋아요

성공했습니다 감사합니다:blush:

2개의 좋아요

이전 버전의 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 로도 열리지 않는군요:joy:
혹시 다른 방법이 있을까요?

2개의 좋아요

컬렉션 형식의 문제같지는 않아 보입니다.

인덱서는 거의 대부분 getter이고, IList 의 인덱서 또한 getter 입니다.

에러가 IndexOutOfRange 가 아니기에, 컬렉션에는 null 이 분명히 들어 있음을 확정할 수 있습니다.
따라서, 문제의 코드는 null 값을 get 한 것 뿐이라 정상적인 동작입니다.

LabelCollection 에 아래와 같은 코드가 숨어 있을 수도 있구요.

if(label == null)
    label = "";

그래서, null을 set 한 코드를 찾는 게 문제 해결 방법일 것 같습니다.

4개의 좋아요

감사합니다 확인해보겠습니다 !!

3개의 좋아요