Microsoft MVP성태의 닷넷 이야기
yield 질문있습니다!! [링크 복사], [링크+제목 복사],
조회: 12724
글쓴 사람
한예지 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]

... [76]  77  78  79  80  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
643해운대끓...5/15/200712546Singleton 패턴 테스트중 하나의 윈폼만 열기 오류파일 다운로드1
644정성태5/15/200713204    답변글 [답변]: Singleton 패턴 테스트중 하나의 윈폼만 열기 오류 [1]
642조성택5/10/200714299스레드와 WinINet? [1]
641한귀순5/8/200713060Code Obfuscate 에 관한 질문. ^^ [2]
640박희진5/7/200712701스마트 클라이언트에서 ActiveX 브라우저 컨트롤을 사용한 경우 javascript 문제 [1]
639김재영5/3/200719991webBrowser클래스에서 띄워지는 Javascript 오류 다이얼로그를 감지할 수 있습니까? [2]
638최민규4/29/200713640SmartPhone / PDA 등에서의 .NET Smartclient [1]
636라이프가드4/27/200714300Insert 오류입니다. CLOB ........ [1]
635박희진4/27/200714747스마트클라이언트 위로 DIV가 못올라오고 스마트 클라이언트 뒤로 숨는 현상 [1]
632해운대끓...4/23/200713211이전에 소개 되었던 확장 매서드 아티클을 읽고 생각나는 의문 [1]
620이방은4/18/200715628질문있어요.. [2]
6196/17/200714878Child Form 에서 Mdi Form 의 메소드 Access 방법 [1]
616김우정4/15/200717936CAS 보안설정을 위한 ActiveX 관련 질문입니다 [2]파일 다운로드1
614박성희4/13/200714204IE Embedded된 스마트클라이언트로 로그인 정보를 보내려면 어떻게 해야 되나요? [2]
612김성헌4/11/200716856Vista, ShellExecute(,"runas",) 문제 [1]
611탑~4/10/200713368페이지 치고 들어가는거 막기... [2]
606한귀순4/3/200714074combobox usercontrol [2]
604채영사랑3/29/200714476<질문> System.Runtime.InteropServices.COMException: 개체가 필요합니다. [2]
603근바이3/28/200714014솔루션 -> 구성관리자 [1]
602김성헌3/27/200714361ActiveX 브로커 모듈과 통신방법은 RPC ??
607정성태4/4/200716510    답변글 [답변]: ActiveX 브로커 모듈과 통신방법은 RPC ??
601엔틱스3/22/200714341자동 로그인의 궁금증 [1]
600창민이3/16/200717571ATL 동적조회 관하여... [2]파일 다운로드1
597ygso...3/14/200713594단순 무식한 궁금증.. [1]
596조빵3/14/200713858SmartClient로 사용자PC의 엑셀을 실행시킬수는 없나요? [1]
594ygso...3/13/200714289ClickOnce를 이용하여 SmartClient를 배포할경우.. [2]
... [76]  77  78  79  80  81  82  83  84  85  86  87  88  89  90  ...