F# 从F调用C#委托-是否有更简洁的语法?

F# 从F调用C#委托-是否有更简洁的语法?,f#,delegates,syntactic-sugar,F#,Delegates,Syntactic Sugar,在C#中,如果委托定义如下: delegate void A(); A=()=>{Console.WriteLine(“Test”)}; 它可以通过以下方式调用: a.Invoke();//作品 a();//也有效 在F#中,可以调用C#委托: a.Invoke() // Works fine. a() // Error: This value is not a function and cannot be applied 为什么我不能在F#中使用第二种方法?在C#中,()操

在C#中,如果委托定义如下:

delegate void A();
A=()=>{Console.WriteLine(“Test”)};
它可以通过以下方式调用:

a.Invoke();//作品
a();//也有效
在F#中,可以调用C#委托:

a.Invoke() // Works fine.
a()        // Error: This value is not a function and cannot be applied

为什么我不能在F#中使用第二种方法?在C#中,()操作符只是映射到Invoke方法,还是下面发生了其他事情。在F#中有没有更简洁的语法?

我认为你做不了什么。F#和C#使用不同的类型来表示可以调用的对象。在C#中,自然使用的是委托(如
Func
),而在F#中,自然使用的是F#函数值(
T1->T2
)。从F#调用委托更难看,就像从C#调用F#函数更难看一样

最好的做法是大部分时间使用本机表示,并在边界处将委托转换为函数(反之亦然)

因此,在编写F#代码时,我只使用函数:

let foo f = f(10) + f(32)
但当将其暴露于C#时,我会编写一个操作,在调用
foo
之前接受委托并将其转换为函数:

type CSharpFriendly() =
  static member Foo(f:Func<int, int>) = foo f.Invoke
类型CSharpFriendly()=
静态成员Foo(f:Func)=Foo f.Invoke
这还利用了这样一个事实,即只编写
f.Invoke
返回一个很好的f函数值