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
问题:
- 为什么不起作用?错误消息似乎表明它无法在无参数版本和单参数版本之间做出选择,但为什么?
- 如何添加类型注释以便上面的代码能够编译?
我认为错误只发生在这种情况下,因为构造函数有一个参数 Address
并且类型也有一个 属性 Address
。在 F# 中,命名参数与对象初始化具有相同的语法,因此它不知道要使用哪个功能。
这是一个不寻常的冲突,因为参数名称通常是驼峰式命名,而不是 PascalCase。在这种情况下,一个简单的解决方法是使用未命名的参数而不是对象初始值设定项:
let proxy = WebProxy(Uri("http://127.0.0.1:1234"))
在 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
问题:
- 为什么不起作用?错误消息似乎表明它无法在无参数版本和单参数版本之间做出选择,但为什么?
- 如何添加类型注释以便上面的代码能够编译?
我认为错误只发生在这种情况下,因为构造函数有一个参数 Address
并且类型也有一个 属性 Address
。在 F# 中,命名参数与对象初始化具有相同的语法,因此它不知道要使用哪个功能。
这是一个不寻常的冲突,因为参数名称通常是驼峰式命名,而不是 PascalCase。在这种情况下,一个简单的解决方法是使用未命名的参数而不是对象初始值设定项:
let proxy = WebProxy(Uri("http://127.0.0.1:1234"))