2012-06-04 2 views
7

나는 거의 동일하지만 유일한 차이점은 func, 다른 하나는 action을 사용한다는 점입니다. 그리고 가능하면 그것들을 하나의 함수로 결합하고 싶습니다.void 반환과 함께 Func 작성하는 방법 #

private static void TryCatch(Action action) 
    { 
     try 
     { 
      action(); 
     } 
     catch (Exception x) 
     { 
      Emailer.LogError(x); 
      throw; 
     } 
    } 

    private static TResult TryCatch<TResult>(Func<TResult> func) 
    { 
     try 
     { 
      return func(); 
     } 
     catch (Exception x) 
     { 
      Emailer.LogError(x); 
      throw; 
     } 
    } 

답변

3

이 두 가지를 하나의 함수로 결합하면 정말 # 가능하지 않습니다. C#의 void 및 CLR은 단순히 형식이 아니므로 비공유 함수와 다른 반환 의미론을 갖습니다. 이러한 패턴을 올바르게 구현하는 유일한 방법은 void 및 non-void 대리자에 과부하를 제공하는 것입니다.

CLR 제한이 모든 CLR 언어에서 수행 할 수 없다는 것을 의미하지는 않습니다. void을 사용하는 언어에서는 값을 반환하지 않는 함수를 나타내는 것은 불가능합니다. 이 패턴은 값을 반환하지 않는 메서드의 경우 void 대신 Unit을 사용하기 때문에 F #에서 매우 유용합니다.

+0

감사 :

이것은 내가 찾은 간단한 구문입니다. – CaffGeek

4

Func<T> 버전을 사용하여 람다에 동작을 래핑하여 Action 메서드를 구현할 수 있습니다. 이렇게하면 중복 된 코드 중 일부가 제거됩니다.

말했다되고 그건
private static void TryCatch(Action action) 
{ 
    Func<object> fun => 
     { 
      action(); 
      return null; 
     }; 
    TryCatch(fun); 
} 

,이 일에 관련된 추가 오버 헤드 내가 아마 그것을 구현 당신이 현재 가지고있는 방법 (특히 원래 버전에 될 일이 얼마나 짧고 간단하게 부여를 떠날 것, 그래서 개인적으로,이 이 경우).

+0

+1 다른 구문에 대한 내 대답을 참조하십시오. –

+0

고마워, 내가 제안한대로 그대로 두겠습니다. 나는 사실 그것을 단일 기능으로 축소 할 수 없다. – CaffGeek

+0

@Chad No - 하나의 라이너로 만들 수 있습니다. 두 가지로 나뉘어서 어떤 일이 일어나고 있는지 알 수 있었지만 방법은 충분히 짧았습니다. 방법 과부하를 제거하는 방법은 없습니다. –

1

@ReedCopsey가 제시하는대로이 작업을 수행합니다. 그것은 할 수없는 이유에 대한 설명을위한

private static void TryCatch(Action action) 
{ 
    TryCatch(() => { action(); return 0; }); 
} 
+0

Func에 매개 변수를 전달해야하는 경우 어떻게합니까? – Nicknow

관련 문제