CA1035: ICollection 구현에 강력한 형식의 멤버가 있습니다.

항목
RuleId CA1035
범주 Microsoft.Design
주요 변경 내용 주요 변경

원인

public 또는 protected 형식이 System.Collections.ICollection을 구현하지만 System.Collections.ICollection.CopyTo에 대한 강력한 형식의 메서드를 제공하지 않습니다. CopyTo의 강력한 형식 버전은 두 개의 매개 변수를 허용해야 하며 System.Array 또는 System.Object 배열을 첫 번째 매개 변수로 사용할 수 없습니다.

참고 항목

이 규칙은 더 이상 사용되지 않습니다. 자세한 내용은 사용되지 않는 규칙을 참조하세요.

규칙 설명

이 규칙을 준수하려면 사용자가 인터페이스에서 제공하는 기능을 사용할 때 인수를 Object 형식으로 캐스팅할 필요가 없도록 ICollection 구현에서 강력한 형식의 멤버를 제공해야 합니다. 이 규칙에서는 Object보다 강력한 형식의 인스턴스 컬렉션을 관리하기 위해 ICollection을 구현하는 형식이 해당 작업을 수행한다고 가정합니다.

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

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

위반 문제를 해결하는 방법

이 규칙의 위반 문제를 해결하려면 인터페이스 멤버를 명시적으로 구현합니다(CopyTo로 선언). CopyTo로 선언된 강력한 형식의 public 멤버를 추가하고 강력한 형식의 배열을 첫 번째 매개 변수로 사용하도록 설정합니다.

경고를 표시하지 않는 경우

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

예시

다음 예제에서는 ICollection을 구현하는 올바른 방법을 보여 줍니다.

using System;
using System.Collections;
namespace DesignLibrary
{
   
   public class ExceptionCollection : ICollection
   {   
      private ArrayList data;

      ExceptionCollection()
      {
         data = new ArrayList();
      }

      // Provide the explicit interface member for ICollection.
      void ICollection.CopyTo(Array array, int index)
      {
         data.CopyTo(array, index);
      }

      // Provide the strongly typed member for ICollection.
      public void CopyTo(Exception[] array, int index)
      {
         ((ICollection)this).CopyTo(array, index);
      }
   
      // Implement the rest of the ICollection members.
      public int Count
      {
        get 
        {
           return data.Count;
        }
      }

      public object SyncRoot
      {
         get 
        {
           return this; 
        }
      }

      public bool IsSynchronized
      {
         get 
         {
            return false; 
         }
      }

      // The IEnumerable interface is implemented by ICollection.
      // Because the type underlying this collection is a reference type,
      // you do not need a strongly typed version of GetEnumerator.

      public IEnumerator GetEnumerator()
      {
         return data.GetEnumerator();
      }
   }
}

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

CA1039: 목록은 강력한 형식이어야 합니다.

참고 항목