F# - 运算符重载中的意外行为

3
以下的F#代码成功编译:
namespace MyNamespace

module Module = 
    type T = 
        static member (*) (t1: T, t2: T): T = Unchecked.defaultof<T>

    type U = 
        member __.Method(t1: T, t2: T) = t1 * t2

然而,如果在Module上添加private修饰符,则会生成错误:

namespace MyNamespace

module private Module = 
    type T = 
        static member (*) (t1: T, t2: T): T = Unchecked.defaultof<T>

    type U = 
        member __.Method(t1: T, t2: T) = t1 * t2 //error

错误FS0043:成员或对象构造函数“op_Multiply”不是公共的。私有成员只能从声明类型内部访问。受保护的成员只能从派生类型中访问,并且不能从内部lambda表达式中访问。
这个错误听起来不对:
- 它说操作符不是公共的,但在类级别上实际上是公共的。 - 如果使用静态方法替代(*)操作符,则没有错误。

?


这很有趣。对我来说似乎是个bug。我找不到一个已存在的问题描述了这个,所以你可能想要创建一个 - Brian Berns
这很有趣。对我来说似乎是个错误。我找不到一个已存在的问题来描述这个,所以你可能想要创建一个 - Brian Berns
这很有趣。对我来说似乎是个bug。我找不到描述这个问题的现有问题,所以你可能想创建一个 - undefined
1个回答

0

经过一些搜索,这似乎至少是已知的行为(对于少数人)具有糟糕的错误消息和现有的语言建议。

这个 F# 问题 https://github.com/dotnet/fsharp/issues/1956 指向语言建议 https://github.com/fsharp/fslang-suggestions/issues/230

至于为什么会发生这种情况,Don Syme 在上述链接中提到:

"private" 在 F# 中表示 "对封闭的命名空间声明组或模块私有"。

然而,现在所有静态解析调用的解决方案都必须是公共的。有一个开放的语言建议来取消这个限制,如果那样的话,这段代码确实可以编译。


在搜索过程中,我碰巧找到了一些相关的StackOverflow问题:


虽然这个链接可能回答了问题,但最好在这里包含答案的关键部分,并提供链接作为参考。仅有链接的答案如果链接页面发生变化,就会失效。- 来自审核 - user16217248
1
虽然不太清楚你认为还应该包括什么内容。答案是“这是已知的行为,而且有一个关于它的语言建议。”,这就是我的回答所说的。 - bmitc
1
虽然不太清楚你认为还应该包括什么内容。答案是“这是已知的行为,而且有一个语言建议。”这就是我的回答所说的。 - bmitc
现在看起来不错。 - user16217248
现在看起来不错。 - user16217248
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接