类型 'IpLoc option' 不包含字段 'ip'

The type 'IpLoc option' does not contain a field 'ip'

我有一个 return 记录类型的函数,但编译器抱怨:

The type 'IpLoc option' does not contain a field 'ip'

函数如下所示:

let validIp (list : IpRanges list) (ip:string) : option<IpLoc> =
     list
        |> Seq.pick (fun e -> 
            let range = IPAddressRange.Parse(e.ipStartEnd);

            match range.Contains(IPAddress.Parse(ip)) with
            | true -> Some({ip=ip; subnet=e.subnet; gateway=e.gateway})
            | false -> None
        )

类型是

type IpLoc =
     { ip : String
       subnet : String
       gateway : String }

我做错了什么?

函数Seq.pickreturn是第一个,其中提供的函数return是一个一些值.见文件:https://msdn.microsoft.com/en-us/library/vstudio/ee353772(v=vs.100).aspx

例如:

let aseq = [ 'a'; 'b'; 'c' ]
let picked = aseq |> Seq.pick (fun e -> if e = 'b' then Some 42 else None)
> 
val picked : int = 42

因此您的 validIp 函数 return 是 IpLoc 类型的值,而不是声明的 Option<IpLoc> 类型的值。

更改函数类型或将 returning 值更改为 Option 类型或使用具有与 returns Option 值相似签名的 **Seq.tryPick** 函数。

请注意,如果提供的函数 returns Some value.[=22 中没有序列中的元素,则 Seq.pick 会抛出异常 (KeyNotFoundException) =]

如果需要return IpLoc:

let validIp (list : IpRanges list) (ip:string) : IpLoc =
     list
        |> Seq.pick (fun e -> 
            let range = IPAddressRange.Parse(e.ipStartEnd);

            match range.Contains(IPAddress.Parse(ip)) with
            | true -> Some({ip=ip; subnet=e.subnet; gateway=e.gateway})
            | false -> None
        )

如果需要return Option<IpLoc>:

let validIpOption (list : IpRanges list) (ip:string) : Option<IpLoc> =
     list
        |> Seq.tryPick (fun e -> 
            let range = IPAddressRange.Parse(e.ipStartEnd);

            match range.Contains(IPAddress.Parse(ip)) with
            | true -> Some({ip=ip; subnet=e.subnet; gateway=e.gateway})
            | false -> None
        )