2011-11-03 5 views
1

이것은 단지 경험적/학습적인 예일뿐입니다. 나는 극단적 인 기능적 멍청한 놈입니다.함수를 매개 변수로 사용하는 함수를 만드는 방법은 무엇입니까?

# 코드는 C#을에서 사용하는 F :

module C 
open System 
open System.Collections.Generic 
let Log format (f:Action<List<Object>>) = 
    let arguments = f.Invoke(new List<Object>()) 
    let message = String.Format(format, arguments) 
    Console.Write(message) 

C# 코드를 호출 :

C.Log("Hello {0}", c => 
     { 
      c.Add("World"); 
     }); 

예상 결과

Hello World 

실제 결과

Hello 

답변

3

문제는 당신이 새로운 List<Object>을 만들고 그것을 Action<T>에 전달하고 있다는 것입니다. Action<T> 대리자는 값을 반환하지 않으므로이 목록을 다시 가져올 수 없습니다. 대신 Invoke 메서드는 null을 반환하며 이는 String.Format 호출에서 무시됩니다. 다음

let list = List<Object>(); 
f.Invoke(list); 
let message = String.Format(format, list.ToArray()); 
+2

좋은, 감사를 시도 위임 호출 및 String.Format

의 목록을 유지합니다 -뿐만 아니라 그것을 list.ToArray()을했습니다. –

관련 문제