Page 27 -
P. 27

여러 개의 타입 매개변수에 대해 동일한 타입 인수를 지정하는 것은 문제가 되지 않으며, 실제로
               그렇게 자주 사용하기도 한다. 예를 들어, 문자열과 문자열 사이에 매핑 관계를 가지고 있는 컬렉
               션이 필요하다면 Dictionary<string, string>과 같이 코드를 작성할 수 있다.

               앞서 IAmConfusing의 예를 다시 살펴보면, 제네릭 타입이 아닌 enum 타입으로 IAmConfusing을 선
               언한 부분을 발견할 수 있을 것이다. 이는 다음에 설명할 내용을 미리 드러내기 위해 의도적으로
               포함한 예다.





               2.1.3  제네릭이 될 수 있는 것


               모든 타입과 모든 타입 멤버가 제네릭이 될 수 있는 것은 아니다. 선언할 수 있는 타입의 종류 자
               체가 그리 많지 않으므로 제네릭이 될 수 있는 타입에 대한 규칙은 비교적 단순하다. enum은 제네
               릭이 될 수 없지만, 그 외 클래스, 구조체, 인터페이스, 델리게이트는 모두 제네릭이 될 수 있다.

               타입 멤버의 경우는 조금 복잡하다. 일부 멤버의 경우 다른 제네릭 타입을 사용할 수도 있기 때문
               에 간혹 제네릭처럼 보일 때가 있다. 하지만 제네릭으로 선언하려면 새로운 타입 매개변수를 반드

               시 포함해야 한다는 것을 기억하기 바란다.
               메서드와 중첩 타입은 제네릭이 될 수 있지만, 다음에 나열한 멤버는 제네릭이 될 수 없다.


                 ●   필드(field)

                 ●   속성(property)
                 ●   인덱서(indexer)

                 ●   생성자(constructor)

                 ●   이벤트(event)

                 ●   종료자(finalizer)

               필드를 마치 제네릭으로 선언한 것처럼 보이는 다음 예를 살펴보자. 그리고 실제로는 이 코드가
               필드를 제네릭으로 선언한 것이 아님을 확인해 보자.

                 public class ValidatingList<TItem>
                 {
                     private readonly List<TItem> items = new List<TItem>();    다양한 다른 멤버가 있다고 가정
                 }



         068
   22   23   24   25   26   27   28   29   30   31   32