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)
我现在正在看东西,摆弄一个小时,我做错了什么?
接口中的方法以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)