Generic.IList<T>.this[]와 IList.this[] 간의 호출 모호성을 해결하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/57054

문제

IList<T>와 List를 모두 확장하는 인터페이스를 구현하는 컬렉션이 있습니다.

public Interface IMySpecialCollection : IList<MyObject>, IList { ... }

이는 두 가지 버전의 인덱서가 있음을 의미합니다.

일반 구현을 사용하고 싶기 때문에 일반적으로 구현합니다.

public MyObject this[int index] { .... }

직렬화에는 IList 버전만 필요하므로 이를 숨기도록 명시적으로 구현합니다.

object IList.this[int index] { ... }

그러나 내 단위 테스트에서는 다음과 같습니다.

MyObject foo = target[0];

컴파일러 오류가 발생합니다

호출은 다음 방법이나 속성 사이에 모호합니다.

나는 이것에 조금 놀랐다.나는 전에 그것을 해본 적이 있다고 믿으며 잘 작동합니다.내가 여기서 무엇을 놓치고 있는 걸까요?IList<T>와 IList가 동일한 인터페이스 내에서 공존하도록 하려면 어떻게 해야 합니까?

편집하다 IList<T>는 ~ 아니다 IList를 구현하고 ~ 해야 하다 직렬화를 위해 IList를 구현합니다.해결 방법에는 관심이 없으며 내가 무엇을 놓치고 있는지 알고 싶습니다.

다시 편집:인터페이스에서 IList를 삭제하고 이를 수업으로 옮겨야 했습니다.인터페이스를 구현하는 클래스는 결국 IDictionary 또는 IList를 구현하기 위한 컬렉션이 필요한 Xaml로 직렬화될 예정이므로 이 작업을 수행하고 싶지 않습니다.

도움이 되었습니까?

해결책

당신은 이것을 할 수 없습니다

public interface IMySpecialCollection : IList<MyObject>, IList { ... }

그러나 클래스를 사용하여 원하는 작업을 수행할 수 있으므로 인터페이스 중 하나에 대한 구현을 명시적으로 만들어야 합니다.내 예에서는 IList를 명시적으로 만들었습니다.

public class MySpecialCollection : IList<MyObject>, IList { ... }

IList<object> myspecialcollection = new MySpecialCollection(); IList list = (IList)myspecialcollection;

IMySpecialCollection에서 직렬화를 위해 ISerialized를 구현하는 것을 고려해 보셨나요?여러 컬렉션 유형을 지원하는 것은 나에게 약간 잘못된 것 같습니다.IList는 IEnumerable과 ICollection을 래핑하기 때문에 직렬화를 위해 IList를 IEnumerable로 캐스팅하는 방법을 살펴볼 수도 있습니다.

다른 팁

이것은 속이는 것입니다 내 질문은 여기

요약하자면 이렇게 하면 문제가 해결됩니다.

public Interface IMySpecialCollection : IList<MyObject>, IList
{
    new MyObject this[int index];
    ... 
}

안타깝게도 동일한 매개변수 목록을 사용하여 두 개의 인덱서를 선언할 수 없습니다.다음 단락은 여기에서 가져온 것입니다. C# 프로그래밍 가이드 - 인덱서 사용 "설명" 섹션:

인덱서의 서명은 형식 매개변수의 수와 유형으로 구성됩니다.인덱서 유형이나 형식 매개변수의 이름은 포함되지 않습니다.동일한 클래스에서 두 개 이상의 인덱서를 선언하는 경우 서명이 서로 달라야 합니다.

두 번째 인덱서를 사용하려면 다른 매개변수 세트를 선언해야 합니다.

일반 구현을 다음으로 변경하십시오.

T IList<T>.this[int index] { get; set; }

이것은 어느 '이것'이 어느 것인지를 명시적으로 말합니다.

List<T>는 IList를 의미하므로 동일한 클래스에서 두 가지를 모두 사용하는 것은 좋지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top