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보다 강력한 형식의 인스턴스 컬렉션을 관리한다고 가정합니다.

IListSystem.Collections.ICollectionSystem.Collections.IEnumerable 인터페이스를 구현합니다. IList를 구현하는 경우 ICollection에 필요한 강력한 형식의 멤버를 제공해야 합니다. 컬렉션의 개체가 System.ValueType을 확장하는 경우 boxing으로 인한 성능 저하를 방지하기 위해 강력한 형식의 GetEnumerator 멤버를 제공해야 합니다. 컬렉션의 개체가 참조 형식인 경우에는 이 작업이 필요 없습니다.

이 규칙을 준수하려면 InterfaceName.InterfaceMemberName 형식의 이름(예: Add)을 사용하여 인터페이스 멤버를 명시적으로 구현합니다. 명시적 인터페이스 멤버는 인터페이스에서 선언된 데이터 형식을 사용합니다. 인터페이스 멤버 이름(예: Add)을 사용하여 강력한 형식의 멤버를 구현합니다. 강력한 형식의 멤버를 public으로 선언하고, 매개 변수와 반환 값을 컬렉션에서 관리되는 강력한 형식으로 선언합니다. 강력한 형식은 인터페이스에서 선언된 약한 형식(예: Object, Array)을 바꿉니다.

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 IList 멤버를 명시적으로 구현하고 이전에 언급한 멤버에 대한 강력한 형식의 대안을 제공합니다. IList 인터페이스를 올바르게 구현하고 필요한 강력한 형식의 멤버를 제공하는 코드는 다음 예제를 참조하세요.

경고를 표시하지 않는 경우

새 컬렉션을 확장하는 형식에 따라 강력한 형식이 결정되는 새 개체 기반 컬렉션(예: 연결된 목록)을 구현하는 경우 이 규칙의 경고를 표시하지 않습니다. 해당 형식은 이 규칙을 준수하고 강력한 형식의 멤버를 노출해야 합니다.

예시

다음 예제에서 YourType 형식은 모든 강력한 형식의 컬렉션과 마찬가지로 System.Collections.CollectionBase를 확장합니다. CollectionBaseIList 인터페이스의 명시적 구현을 제공합니다. 따라서 IListICollection에 대한 강력한 형식의 멤버만 제공하면 됩니다.

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 구현에 강력한 형식의 멤버가 있습니다.

CA1038: 열거자는 강력한 형식이어야 합니다.

참고 항목