以下代码来自《F# 4.0 设计模式》第 5 章。
let a = 1,"car"
type System.Tuple<'T1,'T2> with
member t.AsString() =
sprintf "[[%A]:[%A]]" t.Item1 t.Item2
(a |> box :?> System.Tuple<int,string>).AsString()
Run Code Online (Sandbox Code Playgroud)
期望的输出是[[1]:["car"]]
但是,下面会出现一条红色波浪线AsString()
。“字段、构造函数或成员‘AsString’未定义。也许您需要以下之一:ToString”
这是一个有点奇怪的代码示例 - 我怀疑它的要点是 F# 元组实际上是使用System.Tuple
- 通过显示可以在普通 F# 元组上调用的扩展来表示的 .NET 元组System.Tuple
。
我怀疑 F# 的行为已经改变,它不再允许这样做 - 可能是在 上允许添加扩展System.Tuple
,但在普通 F# 元组上不允许,但两者在编译器中变得更加统一。
但是,您可以使用 .NET 样式的扩展方法执行非常类似的操作:
let a = 1,"car"
[<System.Runtime.CompilerServices.ExtensionAttribute>]
type TupleExtensions =
[<System.Runtime.CompilerServices.ExtensionAttribute>]
static member AsString(t:System.Tuple<'T1,'T2>) =
sprintf "[[%A]:[%A]]" t.Item1 t.Item2
let st = (a |> box :?> System.Tuple<int,string>)
st.AsString()
Run Code Online (Sandbox Code Playgroud)
实际上也可以直接在 F# 元组值上调用:
("car", 32).AsString()
Run Code Online (Sandbox Code Playgroud)