以下工作正常:
type T = int
type I =
abstract member Ok : int
abstract member Ok2 : T
type C() =
interface I with
member this.Ok = 1
member this.Ok2 = 1
但是如果别名是函数而不是方法,则它不起作用:
type T2 = unit -> int
type I2 =
abstract member Ok : unit -> int
abstract member Err : T2
type C2() =
interface I2 with
member this.Ok () = 1
member this.Err () = 1 // No interface member found
我在这里缺少什么?
答案 0 :(得分:4)
确实有效。问题在于你测试它的方式。例如,如果你写这样的最后一行:
member this.Err = fun () -> 1
会正常工作,它会给你一些正在发生的事情。
您的别名将作为(unit -> int)
应用于parens,这会产生影响,而是创建一个包含F#函数值的属性。
尝试在此处添加parens:
abstract member Ok : (unit -> int)
然后第一种方法必须以相同的方式重写。所以问题在于,当您编写abstract member Ok : unit -> int
标准.NET方法而没有创建输入参数时,如果要在编译版本中保留F#语法单元类型,则需要添加parens。