我正在学习在F#中创建复合*类型,但我遇到了一个问题。我有这种类型和ToString覆盖。
type MyType =
| Bool of bool
| Int of int
| Str of string
with override this.ToString() =
match this with
| Bool -> if this then "I'm True" else "I'm False"
| Int -> base.ToString()
| Str -> this
let c = Bool(false)
printfn "%A" c
我在ToString覆盖中得到一个错误,表示"这个构造函数应用于0参数但是期望1"。我很确定这段代码不会编译,但它显示了我尝试做的事情。当我注释掉覆盖并运行代码时,c
打印出" val c:MyType = Bool false"。当我进入该代码时,我看到c的属性Item
设置为布尔值false
。但我似乎无法在代码中访问此属性。即使我注释c
。
在这种情况下,我应该如何重写ToString?
* 我很确定这些被称为复合类型。
答案 0 :(得分:5)
当您使用Discriminated Union(DU)(这是该类型的相应名称)时,您需要在匹配语句中解压缩值,如下所示:
type MyType =
| Bool of bool
| Int of int
| Str of string
with override this.ToString() =
match this with
| Bool(b) -> if b then "I'm True" else "I'm False"
| Int(i) -> i.ToString()
| Str(s) -> s
let c = Bool(false)
printfn "%A" c
您看到的Item
属性是一个实现细节,不能从F#代码访问。仅仅使用this
不起作用,因为DU是值的包装器,因此this
引用包装器,而不是包含的值。