Как создать функцию, которая принимает функцию в качестве параметра? - PullRequest
1 голос
/ 04 ноября 2011

Это просто экспериментальный / обучающий пример.Я чрезвычайно функциональный нуб.

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

1 Ответ

3 голосов
/ 04 ноября 2011

Проблема в том, что вы создаете новый 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...