假设我有一个带有索引器的类型A,例如类型A是一个库.现在我想扩展它的索引器,例如在这里我想在索引器中添加浮点数.
我制定了以下代码:
type A(a:int array) =
member this.Item
with get(x) = a.[x]
and set(x) value = a.[x] <- value
type A with
member m.Item with
get(x:float) = m.[x |> int]
and set(x:float) v = m.[x |> int] <- v
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用:
let a = A([| 1;2;3 |])
a.[1]
a.[1] <- 10
a.[1.0]
Run Code Online (Sandbox Code Playgroud)
对于最后一行,我得到:
Script1.fsx(243,4): error FS0001: This expression was expected to have type
int
but here has type
float
Run Code Online (Sandbox Code Playgroud)
是否可以在F#中扩展索引器?谢谢!
当在单独的程序集(或单独的模块)中定义类型扩展并且它与类型定义位于同一模块中时,这种行为会有所不同.
当两者都在同一个模块中时,F#将它们编译成一个类并Item成为标准的重载索引器 - 在这种情况下,你的代码按预期工作(这就是你在这里实际编写它的方式).
当它们位于单独的模块中时,F#将索引器编译为扩展成员.在这种情况下,我收到您描述的错误消息.
可以使用扩展成员(例如,新方法)添加新的重载.据我所看到的,specificaton不说这不应该被用于索引工作,所以我认为这是一个错误(可以将其报告给fsbugs在微软点COM?)
| 归档时间: |
|
| 查看次数: |
292 次 |
| 最近记录: |