我在F#中编写了一个简单的函数,并能够正确地从同一解决方案中另一个项目中的C#代码调用它。然后,我尝试进行重构,使得我从C#中调用的F#函数是原始函数部分应用的结果,但出现了编译时错误Non-invocable member: 'Calculators.TenPercentCalculator' cannot be used like a method.
这里是工作的F#代码:
let TenPercentItemCalculator (paymentItem : PaymentItem) =
1.1M * paymentItem.Amount
let ExtractItems (payment : Payment) = List.ofSeq(payment.PaymentItems)
let TenPercentCalculator (payments : Payment seq) =
payments |> Seq.map ExtractItems |> List.concat |> List.map TenPercentItemCalculator |> List.sum
下面是重构后的 F# 代码,但该代码无法编译:
let TenPercentItemCalculator (paymentItem : PaymentItem) =
1.1M * paymentItem.Amount
let ExtractItems (payment : Payment) = List.ofSeq(payment.PaymentItems)
let BaseCalculator (itemCalculator: PaymentItem -> decimal) (payments : Payment seq) =
payments |> Seq.map ExtractItems |> List.concat |> List.map itemCalculator |> List.sum
let TenPercentCalculator : (Payment seq -> decimal) = BaseCalculator TenPercentItemCalculator
在这两种情况下,以下是调用 TenPercentCalculator
函数的 C# 代码:
var interest = Calculators.TenPercentAuctionCalculator(SampleLedger.Payments);
Microsoft.FSharp.Core.FSharpFunc<'T,'U>
的对象。我对此并不熟悉,但我猜想您需要显式调用Invoke
,例如...tionCalculator.Invoke(SampleLedg...)
。请参见此处(搜索“Functions”):http://www.voyce.com/index.php/2011/05/09/mixing-it-up-when-f-meets-c/。 - Søren Debois