从 F# 调用 C# 委托 - 是否有更简洁的语法?
Invoking C# delegate from F# - Is there a cleaner syntax?
在 C# 中,如果委托定义如下:
delegate void A();
A a = () => {Console.WriteLine("Test")};
可以通过以下方式调用:
a.Invoke(); // Works
a(); // Also works
在 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<T1, T2>
),而在 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
这也利用了这样一个事实,即仅编写 f.Invoke
returns 一个不错的 F# 函数值。
在 C# 中,如果委托定义如下:
delegate void A();
A a = () => {Console.WriteLine("Test")};
可以通过以下方式调用:
a.Invoke(); // Works
a(); // Also works
在 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<T1, T2>
),而在 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
这也利用了这样一个事实,即仅编写 f.Invoke
returns 一个不错的 F# 函数值。