Microsoft MVP성태의 닷넷 이야기
yield 질문있습니다!! [링크 복사], [링크+제목 복사],
조회: 15146
글쓴 사람
한예지 donator
홈페이지
첨부 파일
 

선생님 안녕하세요!
아래 예제는 제가 작성한 코드입니다.

class Program
    {
        static IEnumerable<int> GetScores()
        {
            int[] scores = new int[] { 10, 20, 30 };
            yield return scores[0];
            yield return scores[1];
            yield return scores[2];
        }

        static void Main(string[] args)
        {
            // ★ CASE Ⅰ ★
            foreach (int score in GetScores())
            {
                
                Console.WriteLine(score);
            }

            // ★ CASE Ⅱ ★
            IEnumerator<int> ienumerator = GetScores().GetEnumerator();
            while (ienumerator.MoveNext())
            {
                Console.WriteLine(ienumerator.Current.ToString());
            }
        }
    }

https://www.sysnet.pe.kr/2/0/11887 게시글에 보면
반환 타입은 반드시 IEnumerable, IEnumerable<T>, IEnumerator, IEnumerator<T> 중의 하나여야 한다고 하셨는데
교재도 그렇고 다른 예제를 참고해봐도 IEnumerable<T> 밖에 사용하지 않더라구요...
그래서 GetScores() 함수의 반환 타입을 IEnumerator<T>로 바꾸니까 컴파일 오류가 발생했습니다.
질문 1) yield는 IEnumerator<T>와 같이 사용한다고 받아들이는 것이 좋을까요?

질문 2)
CASE Ⅰ과 CASE Ⅱ가 동일한 결과를 출력하는 것으로 추론해보았습니다.
scores[0]이 IEnumerable<int>로 형변환이 되어 foreach로 넘겨진다고 생각해도 될까요?








[최초 등록일: ]
[최종 수정일: 2/8/2021]


비밀번호

댓글 작성자
 



2021-02-08 06시30분
답변 1) 11887 글에서 이미 설명했는데, 왜 동일한 내용으로 질문하시는 것인지 잘 이해가 안 됩니다.

교재나, 다른 예제가 IEnumearble만 반환하는 것은 사실 대표적인 응용 사례이기 때문입니다. IEnumerator를 반환하는 경우는 11887 예제처럼 인스턴스를 곧바로 foreach에 노출시키고 싶은 경우 GetEnumerator라는 메서드 이름으로 고정시켜 사용하는 경우에 한해 사용되는 정도입니다.

그리고, yield가 IEnumerable을 반환할 때는 foreach에서 바로 사용할 수 있고, GetEnumerator를 호출할 수 있겠지만 IEnumerator를 반환하는 경우에는 당연히 기존 소스 코드에서 오류가 발생합니다. 그럴 때는 다음과 같이 사용해야 합니다.

IEnumerator<int> ienumerator = GetScores();
while (ienumerator.MoveNext())
{
    Console.WriteLine(ienumerator.Current.ToString());
}

답변 2) scores[0]이 IEnumerable<int>로 형변환되는 것이 아니라 scores[0]가 int이기 때문에 그 단일 값을 반환하는 것입니다. IEnumerable에 대한 처리는 C# 컴파일러가 자동으로 해줍니다. 이것 역시 11887 글에서 잘 설명하고 있습니다.
정성태
2021-02-08 10시46분
[예지] 답변 감사합니다!!!^^
[guest]

... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
862장근배1/28/201019590AppPolId를 알 수 있는 방법이 있는지요? [1]
864장근배2/1/201019116    답변글 [답변]: AppPolId를 알 수 있는 방법이 있는지요?
858생초보1/26/201019542안녕하세요.. 파일 생성 처리 문제로 .... [2]
857꼭지1/22/201026351How to support Basic + Windows authentication mode in WCF(RESTful service) [4]파일 다운로드2
856질의자1/13/201023244vcredist_x86 배포 관련 여쭙습니다. [1]
855임동찬1/13/201022109이벤트 핸들러와 쓰레드의 관계 2 [4]파일 다운로드2
854임동찬1/12/201022315이벤트 핸들러와 쓰레드의 관계 [1]
853장근배1/12/201020866압축 프로그램,, [1]
852임동찬1/6/201018206base.OnStart(agrs) [1]
851한귀순1/6/201023579oracle & transaction 질문 [5]
850박한주12/31/200920801COM과 C#간 권한 문제에 관해 여쭤봅니다. [5]
848날쌘돌이12/22/200921825C#으로 개발하는 ActiveX 디버깅 문제 [5]
847최승문12/16/200920596winform에서 웹서비스를 이용할때, 객체가 전송안되는 문제... [2]
846이강구12/14/200919491ATL COM 제작 문의 [3]
845김재영12/9/200922317ClickOnce에서 WinForm을 배포시 변동되는 Args값을 넘길 수 있나요? [3]파일 다운로드1
843김재영12/2/200919892Hyper-V 사용에 대해여 질문이 있습니다. [2]
842한귀순12/1/200922704Attempted to read or write protected memory [2]
841장근배11/30/200924503첨부 파일 Download시 한글 Name [2]
844장근배12/3/200918929    답변글 [답변]: 첨부 파일 Download시 한글 Name파일 다운로드1
840박영민11/20/200918962웹 애플리케이션 질문입니다. [1]
837left...10/21/200919510아래 게시글 관련하여 추가 질문 [3]
836left...10/19/200920417ActiveX 상에서 암시적 dll 로드 [1]
832김우진10/15/200916941C# 에서 swa + security 구현 방법이 없을까요?
833정성태10/15/200921343    답변글 [답변]: C#에서 swa + security 구현 방법이 없을까요? [1]
834김우진10/15/200917349        답변글 예제 메시지 올려드릴께요. [2]파일 다운로드1
838이영우10/30/200917254            답변글 국세청 전자세금계선서에 관하여 문의드립니다.
... 61  62  63  64  65  66  67  68  [69]  70  71  72  73  74  75  ...