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

标签 f#

在 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# 中,命名参数与对象初始化具有相同的语法,因此它不知道要使用哪个功能。

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

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

关于F# 对象初始值设定项语法不适用于简单情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71553582/

相关文章:

c# - F# OOP - 实现接口(interface) - 私有(private)和方法名称问题

list - F#:无法在 F# 交互中从 List<'T> 继承

f# - Hello world 不会用 "The value or constructor is not defined"编译

f# - 如何在 F# 中使用 Akka.Streams.*.ConcatMany?

F# noob - 映射和减少单词

wcf - MPI vs. Microsoft WCF vs. Microsoft TPL

date - 在 F# 中将字符串转换为 System.DateTime

.net - F#中的哈希散列和.net中的弱哈希表

c# - 如何在 C# 中创建一个整数序列?

f# - if .. else .. 是一种用 F# 写东西的惯用方式吗?