gpt4 book ai didi

static - 有区别的联合方法看不到它的静态成员

转载 作者:行者123 更新时间:2023-12-04 20:39:57 25 4
gpt4 key购买 nike

这个问题似乎很愚蠢,但我真的不明白。

module Responses =
type Failure =
| Problem of string
| Error of exn
| Timeout
static member toString x =
match x with
| Problem str -> sprintf "Problem %s" str
| Error e -> sprintf "Error %s" (e.ToString())
| Timeout -> "Timeout"
override x.ToString() = Failure.toString x

错误是
      override x.ToString() = Failure.toString x;;
--------------------------------------^^^^^^^^
stdin(11,41): error FS0039: The field, constructor or member 'toString' is not defined

原因是 f# 出于某种原因认为 FailureMicrosoft.FSharp.Core.Operations.Failure 类型

当我尝试写作时
override x.ToString() = Responses.Failure.toString x

我明白了
Startup.fs(14,33): error FS0039: The namespace or module 'Responses' is not defined

当我重命名 Failure例如 xFailure , 有用。但我真的不想重命名它。我可以以某种方式避免重命名并使用静态方法吗?

最佳答案

这是一个有点令人惊讶的行为!我认为这是因为 Failure是 F# 核心库中定义的另一种类型。当您尝试调用静态方法时,编译器(出于某种原因)仅选择 F# 库类型,但不会合并静态方法(这是我所期望的)。

我认为这可能是一个错误 - 所以请报告它 on the F# CodePlex site .

作为一种变通方法,我只想到了一个相当丑陋的想法,就是定义一个私有(private)类型别名,例如 FailureStatic然后使用别名调用静态成员(您的库的用户将看不到它)。

module Responses =
type private FailureStatic = Failure
and Failure =
| Problem of string
| Error of exn
| Timeout
static member toString x =
match x with
| Problem str -> sprintf "Problem %s" str
| Error e -> sprintf "Error %s" (e.ToString())
| Timeout -> "Timeout"
override x.ToString() = FailureStatic.toString x

关于static - 有区别的联合方法看不到它的静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23132468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com