F# 对象初始值设定项语法不适用于简单情况

F# object initializer syntax not working for simple case

在 C# 中,此对象初始化语法工作得很好:

using System.Net;
var p = new WebProxy{Address = new Uri("http://127.0.0.1:1234")};

根据我的理解,F# 中与此类语法等效的内容应如下所示:

open System
open System.Net
let proxy = new WebProxy( Address = Uri("http://127.0.0.1:1234") )

但是,它失败了:

error FS0041: A unique overload for method 'WebProxy'
could not be determined based on type information prior
to this program point. A type annotation may be needed.

Known type of argument: Address: Uri

Candidates:
 - WebProxy() : WebProxy
 - WebProxy(Address: Uri) : WebProxy

问题:

  1. 为什么不起作用?错误消息似乎表明它无法在无参数版本和单参数版本之间做出选择,但为什么?
  2. 如何添加类型注释以便上面的代码能够编译?

我认为错误只发生在这种情况下,因为构造函数有一个参数 Address 并且类型也有一个 属性 Address。在 F# 中,命名参数与对象初始化具有相同的语法,因此它不知道要使用哪个功能。

这是一个不寻常的冲突,因为参数名称通常是驼峰式命名,而不是 PascalCase。在这种情况下,一个简单的解决方法是使用未命名的参数而不是对象初始值设定项:

let proxy = WebProxy(Uri("http://127.0.0.1:1234"))