2016-09-01 2 views
1

다음과 같은 수업이 있습니다. 제네릭 형식이 testb에 대해 정의하는 동안 난 그냥 testatestb이 같은 결과를 얻을 수있는 기능을 얻으려면, 종피는, 그것으로 명시 적 형식 문자열이 있습니다Func <T>이있는 함수에 대한 매개 변수로서의 동작 <T,T> 동작 및 본문 작성 방법은 무엇입니까?

public class testclass 
{ 
    public void testa(Func<String, String> action) 
    { 

     Console.WriteLine(action("what?")); 
    } 

    public void testall() 
    { 
     testa(tc => 
     { 
      return tc; 
     }); 

     testb<string>(tc => 
     { 
      return tc; 
     }); 
    } 

    public void testb<T>(Func<T, T> action) 
    { 

     **//How to write the body here to get the same result as testa do 
     //like action("abc");?** 
    } 

} 

답변

5

당신은 캔트 그래서 당신은 Ttestb에 무엇인지 잘 모릅니다 default(T) 제외하고 concretete 값을 제공 :

public void testb<T>(Func<T, T> action) 
{ 
    action(default(T)); // null for reference types, 0 for ints, doubles, etc  
} 

또 다른 옵션은 testb

012에 테스트 값을 제공하는 것 3,

세 번째 옵션은 T에 제약 new()을 제공하는 것입니다, 그리고 당신은 하나를 만들 수 있습니다 :

public void testb<T>(Func<T, T> action) where T : new() 
{ 
    action(new T());   
} 

리틀 (!) 참고를 : 주석으로 action는 일반적으로 함수 표현식에 주어진 이름입니다 (예 : Action<T> 또는 Action<string> 등). 그것은 당신의 코드에 아무런 차이가 없지만, 다른 프로그래머를 혼동시킬 수 있습니다. 우린 아주 대단한 녀석이에요!

+1

'Func '변수'action'을 호출하는 것은 약간 재미 있습니다. :) –

+0

물론 @YuvalItzchakov 당신 말이 맞아. 필자의 선호는'func'이지만 혼동을 막기 위해 OP의 원래 코드를 고수하고 있습니다. – Jamiec

관련 문제