Попытки передать код Action в F # приводят к следующей синтаксической ошибке в .net 4.6.1, VS2015...
Error CS1503 Argument 1:
cannot convert from 'System.Action<string>' to
'Microsoft.FSharp.Core.FSharpFunc<string, Microsoft.FSharp.Core.Unit>'
Попытки заключаются в следующем...
using Microsoft.FSharp.Core;
....
Action<string> logger = Console.WriteLine;
App.perform(new Action<string>(Console.WriteLine), args);
App.perform(logger, args);
App.perform(new Action<string>(msg => Console.WriteLine(msg)), args);
App.perform((new Action<string>(msg => Console.WriteLine(msg))), args);
App.perform((new Func<string,Unit>(msg => Console.WriteLine(msg))), args);
App.perform(new Func<string,Unit>(Console.WriteLine), args);
Как правильно передать System.Console.WriteLine
из С# в F #?
Microsoft.FSharp.Core.FuncConvert
предоставляет различные функции преобразования/адаптера, одна из которых может адаптировать Action<string>
к FSharpFunc<string, unit>
.
// Reference: FSharp.Core.dll
var writeLine = Microsoft.FSharp.Core.FuncConvert.FromAction<string>(Console.WriteLine);
App.perform (writeLine);
Проблема в том, что делегат Action<string>
и FSharpFunc<string, unit>
не имеют отношения к среде выполнения, хотя мы знаем, что они концептуально близки. К сожалению, С# не добавил никакой поддержки, чтобы помочь с совместимостью F #.
FSharpFunc
. Моя первая попытка сделала это, но потом я нашел подходящий вспомогательный метод.
Вы должны конвертировать Action<T>
в F # FSharpFunc<T>
. Это необходимо, потому что все лямбда-функции в F # используют скрытую функцию FSharpFunc, и они не имеют одинаковую семантику.
FSharpFunc<_>
. Почему вы продолжаете пытаться передать емуAction
илиFunc
?