2017-10-20 37 views
1

我正尝试使用ImageSharp编辑F#中的图像。我挣扎以获取图像突变工作F#中的图像锐化变异#

要做到在C#中的形象突变,它看起来像你只需要使用mutate method and a lambda

image.Mutate(x => x.Kodachrome()) 

通常情况下,要改变C#lambda表达式到F#,我只想使用匿名函数,像这样:

image.Mutate(fun x -> x.Kodachrome()) 

当我这样做,我得到以下错误:

No overloads match for method 'Mutate'. The available overloads are shown below (or in the Error List window).

它看起来像Mutate方法需要一个ImageProcessor,但由于某种原因在F#编译器无法弄清楚匿名函数是一个ImageProcessor。我如何获得图像变异在F#中工作?

+0

'Mutate'方法是否有任何重载? –

+1

我认为它只有一个:(扩展名)Image.Mutate <'TPixel(需要默认的构造函数和值类型和'TPixel:> IPixel <'TPixel>和'TPixel:> ValueType)>([] operations:IImageProcessor <'TPixel> []) :单元 – Jonathan

+1

该参数类型看起来像一个接口,但您的C#代码正在传递一个lambda表达式。这不计算。你确定这是唯一的超载吗? –

回答

5

F#可以从一个匿名函数(fun ...)自动转换为System.Action<_>,但前提是类型完全匹配。在这里,他们没有,因为Kodachrome()不返回unit。所以你需要忽略它的返回值:

image.Mutate(fun x -> x.Kodachrome() |> ignore) 
+0

F#很奇怪。为什么会期望一个uint? –

+1

不是单位。 F#相当于无效。 – Tarmil

+0

我很震惊这是多么容易修复! – Jonathan

2

您需要将您的F#拉姆达转换成明确的行动:

image.Mutate <| Action<_> (fun x -> x.Kodachrome())