【问题标题】:Does IPEndpoint have to be up-cast and why?IPEndpoint 是否必须向上转换,为什么?
【发布时间】:2017-04-18 19:50:32
【问题描述】:
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)
    )

在上面不完整的代码sn-p中,

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

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

第二个错误,我之前没见过,是

This value is not a function and cannot be applied.

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

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

【问题讨论】:

  • 你需要使用.[0]来索引一个集合——否则它会被解析为对列表应用一个函数[0]

标签: .net sockets f# dns


【解决方案1】:

正如 kvb 在评论中所说的那样

a[0]

表示“将a 视为应用于单个参数‘仅包含零的列表’的函数”。

你想要

a.[0]

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

一旦你解决了这个问题,类型推断将适用于重载解析,并且不需要强制转换等。

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 1970-01-01
    • 2012-11-29
    • 2023-03-17
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多