F# 从F调用C#委托-是否有更简洁的语法?
在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#中,()操
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函数值