所以我有一些以字符串表示的json响应内容,我想获取其属性名称。
我在做什么
let properties = Newtonsoft.Json.Linq.JObject.Parse(responseContent).Properties()
let propertyNames, (jprop: JProperty) = properties.Select(jprop => jprop.Name);
根据this的回答,我需要对扩展方法的调用进行注释,但是,仍然出现错误。
无法基于此程序点之前的类型信息确定方法“选择”的唯一重载。可能需要类型注释。候选对象:(扩展名)Collections.Generic.IEnumerable.Select <'TSource,'TResult>(选择器:Func <'TSource,'TResult>):Collections.Generic.IEnumerable <'TResult>,(扩展名)Collections.Generic.IEnumerable .Select <'TSource,'TResult>(选择器:Func <'TSource,int,'TResult>):Collections.Generic.IEnumerable <'TResult>
我做错什么了吗?
答案 0 :(得分:3)
首先,您要使用的语法x => y
是Lambda表达式的C#语法,而不是F#语法。在F#中,lambda表达式的正确语法为fun x -> y
。
第二,语法let a, b = c
的意思是“破坏该对”。例如:
let pair = (42, "foo")
let a, b = pair // Here, a = 42 and b = "foo"
您可以为一对元素之一提供类型注释:
let a, (b: string) = pair
但是,这对pair
显然不会产生任何影响。
为了为lambda表达式的参数提供类型注释,只需对参数进行注释,哪个更简单?
fun (x: string) -> y
因此,将以上所有内容放在一起,这就是您的代码行的外观:
let propertyNames = properties.Select(fun (jprop: JProperty) -> jprop.Name)
(此外,请注意最后没有分号。F#不需要分号)
如果您在使用基本语法时遇到这种困难,建议您先阅读F#并逐步尝试一些示例,然后再尝试实现复杂的功能。