F#中ToString、ToArray返回unit->函数类型而非值问题咨询
问题原因
F# 调用.NET 无参数实例方法时,若未添加空括号(),不会直接执行方法,而是会将方法本身转换为unit -> 返回值类型的函数值,这就是你得到(unit -> string)、(unit -> string[])类型的根本原因。
你代码中的两处问题均符合该场景:
(archive.GetEntry "mcmod.info").ToString仅引用了ToString方法本身,未实际执行mods.ToArray仅引用了ToArray方法本身,未实际执行
解决方案
在无参数方法名后追加空括号()触发方法执行即可,修改后的正确代码如下:
let readZip filepath = ZipFile.OpenRead filepath let replaceEnvs str = Environment.ExpandEnvironmentVariables str let listFiles rawDir = replaceEnvs rawDir |> Directory.EnumerateFiles let readModMetadata filepath = let archive = readZip filepath (archive.GetEntry "mcmod.info").ToString() // 添加()执行方法,返回string类型 [<EntryPoint>] let main args = let mods = listFiles modsFolder let modAsArray = mods.ToArray() // 添加()执行方法,返回string[]类型 0
补充说明:该规则同时适用于无参数静态方法、F#自定义无参数函数:不加括号获取的是函数本身的引用,加括号才会执行函数得到返回值。
内容的提问来源于stack exchange,提问作者Jamesthe1
相关产品推荐
相关产品推荐

