GetEnumerator
확장 지원이 foreach
루프에 제공됩니다.
메모
이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.
기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 차이는관련
사양의문서에서 기능 규격을 C# 언어 표준으로 채택하는 과정에 대해 자세히 알아볼 수 있습니다.
요약
foreach
루프가 foreach 패턴을 충족하는 확장 메서드 GetEnumerator
메서드를 인식하고, 그렇지 않으면 오류가 발생할 경우 식을 반복하도록 허용합니다.
동기
이렇게 하면 비동기 및 패턴 기반 분해를 포함하여 C#의 다른 기능이 구현되는 방식과 일치하도록 foreach
을(를) 조정합니다.
상세 디자인
사양 변경은 비교적 간단합니다.
The foreach statement
§13.9.5 섹션을 다음 텍스트로 수정합니다.
foreach 문의 컴파일 시 처리 과정은 먼저 식에서 컬렉션 유형, 열거자 유형 및 요소 유형을 결정합니다. 이 결정은 다음과 같이 진행됩니다.
식 형식
X
배열 형식인 경우X
IEnumerable
인터페이스로 암시적 참조 변환이 있습니다(System.Array
이 인터페이스를 구현하기 때문에).컬렉션 형식은 인터페이스이고, 열거자 형식은 인터페이스이고, 요소 형식은 배열 형식의 요소 형식입니다.
X
형식이dynamic
인 경우, 식에서 식가IEnumerable
인터페이스(§10.2.10)로 암시적으로 변환됩니다. 컬렉션 형식IEnumerable
인터페이스이고 열거자 형식IEnumerator
인터페이스입니다.var
식별자가 지역_변수_유형로 지정되면 요소 유형은dynamic
이고, 그렇지 않으면object
입니다.그렇지 않은 경우
X
형식에 적절한GetEnumerator
메서드가 있는지 확인합니다.
- 형식 인수가 없는 형식
X
에서 식별자GetEnumerator
에 대한 멤버 조회를 수행합니다. 멤버 조회가 일치 항목을 생성하지 않거나 모호성을 생성하거나 메서드 그룹이 아닌 일치 항목을 생성하는 경우 아래 설명된 대로 열거 가능한 인터페이스를 확인합니다. 멤버 조회에서 메서드 그룹 또는 일치 항목이 아닌 다른 결과가 나올 경우 경고를 발행하는 것이 좋습니다.- 결과 메서드 그룹 및 빈 인수 목록을 사용하여 오버로드 확인을 수행합니다. 오버로드 확인으로 인해 적용 가능한 메서드가 없거나 모호성이 발생하거나 단일 최상의 메서드가 생성되지만 해당 메서드가 정적이거나 공용이 아닌 경우 아래 설명된 대로 열거 가능한 인터페이스를 확인합니다. 오버로드 확인에서 명확한 퍼블릭 인스턴스 메서드를 제외한 모든 항목이 생성되거나 적용 가능한 메서드가 없는 경우 경고를 발생시키는 것이 좋습니다.
GetEnumerator
메서드의 반환 형식E
클래스, 구조체 또는 인터페이스 형식이 아닌 경우 오류가 생성되고 추가 단계가 수행되지 않습니다.- 식별자
Current
과 형식 인수 없이E
에서 멤버 조회가 수행됩니다. 멤버 조회에서 일치하는 항목이 생성되지 않거나, 결과가 오류이거나, 읽기를 허용하는 공용 인스턴스 속성을 제외한 모든 항목이 결과인 경우 오류가 생성되고 추가 단계가 수행되지 않습니다.- 멤버 조회는 형식 인수가 없는 식별자
MoveNext
로E
에서 수행됩니다. 멤버 조회에서 일치하는 항목이 생성되지 않거나, 결과가 오류이거나, 결과가 메서드 그룹을 제외한 모든 항목인 경우 오류가 생성되고 추가 단계가 수행되지 않습니다.- 오버로드 확인은 빈 인수 목록을 사용하여 메서드 그룹에서 수행됩니다. 오버로드 확인으로 인해 적용 가능한 메서드가 없거나 모호성이 발생하거나 단일 최상의 메서드가 발생하지만 해당 메서드가 정적이거나 public이 아니거나 반환 형식이
bool
않으면 오류가 생성되고 추가 단계가 수행되지 않습니다.- 컬렉션 형식
은 이고, 열거자 형식 은 이며, 요소 형식 은 속성의 형식입니다. 그렇지 않으면 열거 가능한 인터페이스를 확인합니다.
로의 암시적 변환이 가능한 모든 형식 중에서, 가 이 아니고, 다른 모든 에서 로의 암시적 변환이 있으며, 고유한 형식 이 있는 경우,의 컬렉션 형식은 인터페이스 이며,의 열거자 형식은 인터페이스 입니다. 또한,의 요소 형식은 입니다. - 그렇지 않으면 이러한 형식이
T
두 개 이상 있는 경우 오류가 생성되고 추가 단계가 수행되지 않습니다.- 그렇지 않으면,
X
에서System.Collections.IEnumerable
인터페이스로 암시적 변환이 있는 경우, 컬렉션 형식는 이 인터페이스가 되며, 열거자 형식는 인터페이스System.Collections.IEnumerator
이 되고, 요소 형식는object
가 됩니다.그렇지 않으면 'X' 형식에 적절한
GetEnumerator
확장 메서드가 있는지 확인합니다.
- 식별자
GetEnumerator
사용하여 형식X
확장 메서드 조회를 수행합니다. 멤버 조회가 일치 항목을 생성하지 않거나 모호성을 생성하거나 메서드 그룹이 아닌 일치 항목을 생성하는 경우 오류가 생성되고 추가 단계가 수행되지 않습니다. 멤버 조회에서 메서드 그룹을 제외한 모든 항목이 생성되거나 일치하는 항목이 없는 경우 경고가 발생하는 것이 좋습니다.- 결과 메서드 그룹과
X
형식의 단일 인수를 사용하여 오버로드 확인을 수행합니다. 오버로드 확인에서 적용 가능한 메서드가 생성되지 않거나, 모호성이 발생하거나, 단일 최상의 메서드가 발생하지만 해당 메서드에 액세스할 수 없는 경우 오류가 발생하므로 더 이상 단계가 수행되지 않습니다.
- 이 해결 방법을 사용하면
X
구조체 형식이고 ref 종류가in
경우 ref에서 첫 번째 인수를 전달할 수 있습니다.GetEnumerator
메서드의 반환 형식E
클래스, 구조체 또는 인터페이스 형식이 아닌 경우 오류가 생성되고 추가 단계가 수행되지 않습니다.- 멤버 조회는 형식 인수가 없는 식별자
Current
을 사용하여E
에서 수행됩니다. 멤버 조회에서 일치하는 항목이 생성되지 않거나, 결과가 오류이거나, 읽기를 허용하는 공용 인스턴스 속성을 제외한 모든 항목이 결과인 경우 오류가 생성되고 추가 단계가 수행되지 않습니다.- 식별자
MoveNext
을 사용하여E
에서 형식 인수를 사용하지 않고 멤버 조회가 수행됩니다. 멤버 조회에서 일치하는 항목이 생성되지 않거나, 결과가 오류이거나, 결과가 메서드 그룹을 제외한 모든 항목인 경우 오류가 생성되고 추가 단계가 수행되지 않습니다.- 오버로드 확인은 빈 인수 목록을 사용하여 메서드 그룹에서 수행됩니다. 오버로드 확인으로 인해 적용 가능한 메서드가 없거나 모호성이 발생하거나 단일 최상의 메서드가 발생하지만 해당 메서드가 정적이거나 public이 아니거나 반환 형식이
bool
않으면 오류가 생성되고 추가 단계가 수행되지 않습니다.- 컬렉션 형식은
X
이고, 열거자 형식은E
이며, 요소 형식은이Current
속성의 형식입니다.그렇지 않으면 오류가 생성되고 추가 단계가 수행되지 않습니다.
await foreach
경우 규칙도 비슷하게 수정됩니다. 해당 사양에 필요한 유일한 변경 사항은 설명에서 Extension methods do not contribute.
줄을 제거하는 것입니다. 그 외의 사항은 패턴 메서드에 다른 이름이 사용되었을 뿐 위의 규칙을 따르고 있기 때문에 그대로 유지됩니다.
단점
모든 변경은 언어에 추가적인 복잡성을 더해주며, 이것은 foreach
같은 것으로 foreach
설계되지 않은 것들을 잠재적으로 허용할 수 있습니다, 예를 들어 Range
와 같은 것입니다.
대안
아무 작업도 수행하지 않습니다.
해결되지 않은 질문
이 시점에서 없음.
C# feature specifications