2014-09-13 4 views
2

저는이 책을 처음 접했고 (읽거나 시도한 내용이 전혀 없습니다).함수에서 함수를 반환하는 방법은 무엇입니까?

나는 형태의 기능을 사용하려면 : editRx 양식을 가지고

Func<string, Action> getAction = (editingmark) => 
    { 
     Action doit; 
     switch (editingmark) 
     { 
      case ">": 
       doit = editRx; <--ERROR OCCURS HERE. 
       break; 
     } 
     return doit; 
    }; 

:

Action editRx =() => 
    { 
    }; 

내가 얻을 :

필드 이니셜 라이저는 비를 참조 할 수 없습니다 정적 필드, 메소드 또는 속성 ... editRx

어떻게해야합니까? (더 좋은 방법이 있습니까?)

감사합니다. 이 밖에

+0

아마도 'editRx'가 범위를 벗어 났습니까? – Mephy

+2

'editRx'를'static'으로 표시하십시오. –

+0

대체로 정적 메서드 내에서'Func'을 선언하고 Action을 선언합니다. –

답변

4

이 같은 필드로 getAction을 초기화하는 것처럼 보이는 :

public class Foo 
{ 
    Action editRx =() => 
    { 
    }; 
    Func<string, Action> getAction = (editingmark) => 
    { 
     Action doit = null; 
     switch (editingmark) 
     { 
      case ">": 
       doit = editRx; 
       break; 
     } 
     return doit; 
    }; 
} 
여기서 문제는 당신이하려는 것을

클로저가 getAction 인 초기화를 editRx으로 설정하십시오. 그러나 필드 초기화 프로그램에서이를 수행 할 수 없습니다. 이것을 대신 생성자에 넣으십시오.

public class Foo 
{ 
    Action editRx =() => 
    { 
    }; 
    Func<string, Action> getAction; 

    public Foo() 
    { 
     this.getAction = (editingmark) => 
     { 
      Action doit; 
      switch (editingmark) 
      { 
       case ">": 
        doit = editRx; 
        break; 
      } 
      return doit; 
     }; 
    } 
} 

또한 위와 같은 대리자를 사용하는 것이 C#에서는 조금 비 재밌습니다. 이것을 정규 메소드 나 다른 OOP 구조로 리팩토링하고 코드를 훨씬 명확하고 이해하기 쉽게 만들 수 있습니다. 일단 코드를 얻으면 으로 코드를 재구성 할 수있는 방법에 대해 CodeReview.SE에 질문하는 것이 좋습니다.

+0

위의 코드는 상속 될 Base 클래스에 상주합니다. editRx 메소드는 상속의 하위에 따라 다른 작업을 수행합니다. 나는 이것이 가장 쉬운 방법이라고 생각했다. 더 좋은가요? –

+0

@AlanWayne 아마도 [재정의 방법] (http://msdn.microsoft.com/en-us/library/ebca9ah3.aspx)을 사용하십시오. –

2

확인하시기 바랍니다

Func<string, Action> getAction = (editingmark) => 
{ 
    Action doit = null; 
    switch (editingmark) 
    { 
     case ">": 
      doit = editRx; 
      break; 
    } 
    return doit; 
}; 
static readonly Action editRx =() => 
{ 
}; 
관련 문제