加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

泛型 – 管道操作符拒绝工作

发布时间:2020-12-14 04:57:59 所属栏目:百科 来源:网络整理
导读:我无法理解为什么会这样 let data = JsonConvert.DeserializeObjectDictionarystring,Dictionarystring,string( File.ReadAllText | Path.Combine(myPath,"ejv.json")) 没关系,而这个 let data = JsonConvert.DeserializeObjectDictionarystring,string | Fi
我无法理解为什么会这样

let data = 
    JsonConvert.DeserializeObject<Dictionary<string,Dictionary<string,string>>>(
         File.ReadAllText <| Path.Combine(myPath,"ejv.json"))

没关系,而这个

let data = 
    JsonConvert.DeserializeObject<Dictionary<string,string>>> 
    <| File.ReadAllText
    <| Path.Combine(myPath,"ejv.json")

给我两个错误,首先是:

第二是:

我做错了什么?

UPDATE@Patryk?wiek提出了一个很好的编辑,它似乎修复了类型的错误:

let data = JsonConvert.DeserializeObject<Dictionary<string,string>>> 
       << File.ReadAllText 
       <| Path.Combine(myPath,"ejv.json")

但它产生了另一个令人费解的消息:意外的类型参数.
这是一个截图:

我可以很容易地删除它< Dictionary< string,Dictionary< string,string>>>但在这种情况下,我的数据是对象类型,而不是字典.我可以以某种方式保存类型信息使用流水线吗?

感谢@Patryk?wiek解决方案如下:

let d<'a>(s:string) = JsonConvert.DeserializeObject<'a>(s)
let data = 
    Path.Combine(myPath,"ejv.json") 
    |> File.ReadAllText 
    |> d<Dictionary<string,string>>> with

我不知道为什么,但如果没有别名,它就行不通.

解决方法

据我所知,评估从左到右,所以你的第二个表达式相当于:

let data = 
    (JsonConvert.DeserializeObject<Dictionary<string,string>>> <| File.ReadAllText)
    <| Path.Combine(myPath,"ejv.json")

注意操作如何流动.这意味着你首先将一个函数传递给DeserializeObject,可能不是你想要做的.

当你这样做:

let data = 
    JsonConvert.DeserializeObject<Dictionary<string,string>>> 
    <| (File.ReadAllText <| Path.Combine(myPath,"ejv.json"))

它会工作.这相当于你的第一选择.

其他解决方案是反转管道以使数据流更自然:

let data = Path.Combine(myPath,"ejv.json") 
           |> File.ReadAllText 
           |> JsonConvert.DeserializeObject<Dictionary<string,string>>>

编辑

我忽略了一个选项,这不常用.您可以使用函数组合运算符<<使它也有效:

let data = JsonConvert.DeserializeObject<Dictionary<string,string>>> 
           << File.ReadAllText 
           <| Path.Combine(myPath,"ejv.json")

它基本上结合了DeserializeObject:string – > ‘a和ReadAllText:string – > string into(上例中未命名)函数f:string – > ‘a,其中f(s)= DeserializeObject(ReadAllText(s)).然后它通过管道将Path.Combine的结果输入f.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读