2011-11-03 40 views
1

這只是一個經驗/學習的例子。我是一個極端的功能菜鳥。如何創建一個函數作爲參數?

F到從C#中使用#代碼:

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調用中忽略該方法。你需要堅持委託調用,並String.Format

的列表請嘗試以下

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

不錯,感謝 - 不得不讓list.ToArray()爲好。 –

相關問題