如何将Action <string>适配到FSharpFunc <string,unit =“”>

时间:2019-03-25 01:13:12

标签: c# .net f#

尝试将动作传递给F#代码在.net 4.6.1,VS2015中产生以下语法错误...

arcname = os.path.basename(file)

尝试如下...

all_order_files = glob.glob("/directory/"+str(order_submission.id)+"-*")

zip = zipfile.ZipFile("/directory/" + str(order_submission.id) + '-Order-Summary.zip', 'w')

for file in all_order_files:
    zip.write(file)

zip.close()

Error CS1503 Argument 1: cannot convert from 'System.Action<string>' to 'Microsoft.FSharp.Core.FSharpFunc<string, Microsoft.FSharp.Core.Unit>' 从C#传递到F#的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

您必须将Action<T>转换为F#FSharpFunc<T>。这是必须的,因为F#中的所有Lambda函数都在后台使用FSharpFunc,而且它们的语义也不相同。

答案 1 :(得分:3)

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>类无关,尽管我们知道它们在概念上很接近。不幸的是,C#尚未添加任何支持以帮助实现F#互操作性。