如何创建一个函数作为参数?

时间:2011-11-03 22:43:00

标签: f#

这只是一个实验/学习的例子。我是一个极端功能性的菜鸟。

要在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

1 个答案:

答案 0 :(得分: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());