IPEndpoint是否必须被投射,为什么?


let test_smtp (smtp_server_address : string) (port : int) =
let hostEntry : IPHostEntry = Dns.GetHostEntry(smtp_server_address)
let endPoint : IPEndPoint = new IPEndPoint (hostEntry.AddressList[0], port)
( use tcpSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp) 
tcpSocket.Connect(endPoint)
)

在上面不完整的代码片段中,

let endPoint : IPEndPoint = new IPEndPoint (hostEntry.AddressList[0], port)

生成两个错误。第一个表示找不到适当的重载方法。

我以前从未见过的第二个错误是

This value is not a function and cannot be applied.

我通过分配一个分配给 IPAddress 的单独 let 语句,并将错误映射到该行(未包含在上面的示例中)来将其隔离到hostEntry.AddressList[0]

我看过一些关于 F# 无法向上转换的文章,但我仍然有点困惑为什么会发生此错误。

正如kvb在评论中所说

a[0]

意思是"将a视为应用于单个参数'仅包含零的列表'的函数"。

你想要

a.[0]

获取数组a的零索引元素。

修复此问题后,类型推断将适用于重载解析,并且不需要强制转换等。

最新更新