CA1039: 목록은 강력한 형식이어야 합니다.
항목 | 값 |
---|---|
RuleId | CA1039 |
범주 | Microsoft.Design |
주요 변경 내용 | 주요 변경 |
원인
public 또는 protected 형식이 System.Collections.IList를 구현하지만 다음 중 하나 이상에 대한 강력한 형식의 메서드를 제공하지 않습니다.
IList.Item
IList.Add
IList.Contains
IList.IndexOf
IList.Insert
IList.Remove
참고 항목
이 규칙은 더 이상 사용되지 않습니다. 자세한 내용은 사용되지 않는 규칙을 참조하세요.
규칙 설명
이 규칙을 준수하려면 사용자가 인터페이스에서 제공하는 기능을 사용할 때 인수를 System.Object 형식으로 캐스팅할 필요가 없도록 IList 구현에서 강력한 형식의 멤버를 제공해야 합니다. IList 인터페이스는 인덱스를 통해 액세스할 수 있는 개체 컬렉션에서 구현됩니다. 이 규칙에서는 IList를 구현하는 형식이 Object보다 강력한 형식의 인스턴스 컬렉션을 관리한다고 가정합니다.
IList는 System.Collections.ICollection 및 System.Collections.IEnumerable 인터페이스를 구현합니다. IList를 구현하는 경우 ICollection에 필요한 강력한 형식의 멤버를 제공해야 합니다. 컬렉션의 개체가 System.ValueType을 확장하는 경우 boxing으로 인한 성능 저하를 방지하기 위해 강력한 형식의 GetEnumerator 멤버를 제공해야 합니다. 컬렉션의 개체가 참조 형식인 경우에는 이 작업이 필요 없습니다.
이 규칙을 준수하려면 InterfaceName.InterfaceMemberName 형식의 이름(예: Add)을 사용하여 인터페이스 멤버를 명시적으로 구현합니다. 명시적 인터페이스 멤버는 인터페이스에서 선언된 데이터 형식을 사용합니다. 인터페이스 멤버 이름(예: Add
)을 사용하여 강력한 형식의 멤버를 구현합니다. 강력한 형식의 멤버를 public으로 선언하고, 매개 변수와 반환 값을 컬렉션에서 관리되는 강력한 형식으로 선언합니다. 강력한 형식은 인터페이스에서 선언된 약한 형식(예: Object, Array)을 바꿉니다.
위반 문제를 해결하는 방법
이 규칙의 위반 문제를 해결하려면 IList 멤버를 명시적으로 구현하고 이전에 언급한 멤버에 대한 강력한 형식의 대안을 제공합니다. IList 인터페이스를 올바르게 구현하고 필요한 강력한 형식의 멤버를 제공하는 코드는 다음 예제를 참조하세요.
경고를 표시하지 않는 경우
새 컬렉션을 확장하는 형식에 따라 강력한 형식이 결정되는 새 개체 기반 컬렉션(예: 연결된 목록)을 구현하는 경우 이 규칙의 경고를 표시하지 않습니다. 해당 형식은 이 규칙을 준수하고 강력한 형식의 멤버를 노출해야 합니다.
예시
다음 예제에서 YourType
형식은 모든 강력한 형식의 컬렉션과 마찬가지로 System.Collections.CollectionBase를 확장합니다. CollectionBase가 IList 인터페이스의 명시적 구현을 제공합니다. 따라서 IList 및 ICollection에 대한 강력한 형식의 멤버만 제공하면 됩니다.
using System;
using System.Collections;
namespace DesignLibrary
{
public class YourType
{
// Implementation for your strong type goes here.
public YourType() {}
}
public class YourTypeCollection : CollectionBase
{
// Provide the strongly typed members for IList.
public YourType this[int index]
{
get
{
return (YourType) ((IList)this)[index];
}
set
{
((IList)this)[index] = value;
}
}
public int Add(YourType value)
{
return ((IList)this).Add ((object) value);
}
public bool Contains(YourType value)
{
return ((IList)this).Contains((object) value);
}
public void Insert(int index, YourType value)
{
((IList)this).Insert(index, (object) value);
}
public void Remove(YourType value)
{
((IList)this).Remove((object) value);
}
public int IndexOf(YourType value)
{
return ((IList)this).IndexOf((object) value);
}
// Provide the strongly typed member for ICollection.
public void CopyTo(YourType[] array, int index)
{
((ICollection)this).CopyTo(array, index);
}
}
}
관련 규칙
CA1035: ICollection 구현에 강력한 형식의 멤버가 있습니다.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기