2017-01-19 13 views
0

그래서이 함수는 결과를 foreach 문을 통해 반복 할 수 있지만 반환 형식이 인터페이스가 될 수있는 방법을 이해하지 못한다는 것을 이해합니다. 이 상태 MSDN 설명서에 C#에서 함수가 반환 형식으로 IEnumerable 인터페이스를 가질 수있는 방법은 무엇입니까?

public static IEnumerable<int> Func1(int number, int exponent) 
{ 
    int exponentNum = 0; 
    int numberResult = 1; 

    while (exponentNum < exponent) 
    { 
     numberResult *= number; 
     exponentNum++; 

     yield return numberResult; 
    } 
} 

:

인터페이스는 서명

정의하는 인터페이스 • 직접 인스턴스화 할 수 없습니다. 멤버는 인터페이스를 구현하는 클래스 또는 구조체로 구현됩니다.

인터페이스에 메소드 서명 만 있으면 어떻게 함수의 반환 유형이 될 수 있습니까? 이 함수는 foreach 문을 사용 가능하게하는 방법은 무엇입니까?

+0

IEnumerable Sid

+2

을 구현하는 모든 것을 반환 할 수 있습니다. 존재할 수 없으므로 아무 것도 사용할 수 없다고 제안하면 인터페이스가 무엇입니까? 분명히 그렇지 않습니다. 구체적인 클래스는 인터페이스를 구현할 수 있습니다. 객체가'IFoo'를 구현하면, 그 객체에 대한 참조를'IFoo'로 전달할 수 있습니다. 그것이 바로 그들이 원하는 것입니다. 이 경우 yield yield를 사용하여 컴파일러가 마술처럼 구현하는 구체적인 클래스를 만듭니다. –

+0

http://stackoverflow.com/questions/15392224/interface-as-return-type – apomene

답변

3

인터페이스를 구현하는 모든 것을 반환 할 수 있으며 호출 코드는 구체적인 구현이 무엇인지 신경 쓸 필요는 없지만 인터페이스에 선언 된 반환 된 객체의 기능을 사용할 수 있습니다.

코드의 다른 부분에 영향을주지 않고 내부 구현을 변경할 수 있도록하면서 코드 부분간에 표준 인터페이스를 만드는 것이 한 가지 방법입니다.

예를 들어 함수에서 List<int>을 반환 할 수 있습니다.

함수는 yield return을 사용합니다. 즉, 명시 적 목록 개체를 만드는 것이 아니라 반복적으로 각 요소를 하나씩 반환하고 암시 적으로 IEnumerable<int>을 만듭니다. 내부적으로는 IEnumerable을 구현하는 특정 유형을 생성하고이를 반환하지만 호출 코드는 메소드의 반환 유형이기 때문에 코드를 IEnumerable으로 보게됩니다. https://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx은 게시 한 기능과 매우 유사한 세부 정보 및 예를 제공합니다.

0

반환 유형이 인터페이스 인 경우 인터페이스를 구현하는 구체적인 클래스를 함수에서 반환 할 수 있습니다.

간단한 예제로 List<int>을 반환 할 수 있으며 IEnumerable<int>을 구현합니다.