尝试将动作传递给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#的正确方法是什么?
答案 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#互操作性。