F#实现接口,多个参数,获取错误此覆盖采用不同的数量

pet*_*ter 4 .net f# .net-4.0 visual-studio-2010 .net-3.5

我在F#中定义了以下接口

[<ServiceContract>]
type ICarRentalService =
    [<OperationContract>]
    abstract member CalculatePrice: pickupDate:DateTime -> returnDate:DateTime -> pickupLocation:string -> vehiclePreference:string -> float
Run Code Online (Sandbox Code Playgroud)

然后我试着像这样实现它:

type CarRentalService() =
    interface ICarRentalService with
        override this.CalculatePrice(pickupDate:DateTime, returnDate:DateTime, pickupLocation:string, vehiclePreference:string) =
            5.5
Run Code Online (Sandbox Code Playgroud)

编译时我得到以下编译错误:

This override takes a different number of arguments to the corresponding abstract member
Run Code Online (Sandbox Code Playgroud)

我现在正在看东西,摆弄一个小时,我做错了什么?

des*_*sco 6

接口中的方法以curry形式声明,并且您的实现是tupled:如果简单:接口中的方法是接受一个参数的函数,并返回另一个具有剩余参数的函数.在相反的实现中接受一个所有参数(打包在元组中)

open System
type ICarRentalService =
    abstract member CalculatePrice: pickupDate:DateTime -> returnDate:DateTime -> pickupLocation:string -> vehiclePreference:string -> float

let x : ICarRentalService = failwith "not implemented"
let a = x.CalculatePrice // DateTime -> DateTime -> string -> string -> float
let y = a (DateTime.Now) // DateTime -> string -> string -> float (first argument is bound)
Run Code Online (Sandbox Code Playgroud)

要修复代码,您需要使实现curried或声明 - tupled.Curried版本不适用于WCF,因此请考虑使用tupled版本

type ICarRentalService =
    abstract member CalculatePrice: pickupDate:DateTime * returnDate:DateTime * pickupLocation:string * vehiclePreference:string -> float

type CarRentalService() =
    interface ICarRentalService with
        override this.CalculatePrice(pickupDate:DateTime, returnDate:DateTime, pickupLocation:string, vehiclePreference:string) =
            5.5
Run Code Online (Sandbox Code Playgroud)