F#使用通用参数调用.Net函数-不会编译

时间:2018-08-21 17:24:41

标签: f# imagesharp

F#初学者,我想使用ImageSharp绘制多边形。构建失败,并显示以下信息:

  

方法DrawPolygon没有重载匹配。可用的过载如下所示。错误FS0001:此表达式的类型应为'Image',但此处的类型应为'a *'b'。

    let renderRect(img:Image<Rgba32>) =

        let points: PointF list = [
            new PointF(float32 2.0, float32 8.0);
            new PointF(float32 4.0, float32 1.0);
            new PointF(float32 1.0, float32 7.0);
            new PointF(float32 5.0, float32 2.0);
        ]

        img.Mutate (fun x -> x.DrawPolygon(Rgba32.White, 1.0, points))
        img

我要调用的方法的签名:

static IImageProcessingContext<TPixel> DrawPolygon<TPixel>(this IImageProcessingContext<TPixel> source, TPixel color, float thickness, params PointF[] points) where TPixel : struct, IPixel<TPixel>

2 个答案:

答案 0 :(得分:4)

我看到了几个问题:

  1. 正如亚伦所说,您正在传递需要数组的列表。
  2. DrawPolygon的第二个参数应该是float32,而不是float。注意,除了调用float32函数外,您还可以通过添加后缀1.0f来使用正确类型的文字。
  3. Mutate的第二个参数必须是Action<_>,因此它不应该返回任何内容。这意味着您应该忽略DrawPolygon调用的结果,而不要返回它。您可以通过在通话后放置|> ignore来实现此目的。

这是您的代码的版本,解决了以下问题:

let renderRect(img:Image<Rgba32>) =

    let points = [|
        PointF(2.0f, 8.0f);
        PointF(4.0f, 1.0f);
        PointF(1.0f, 7.0f);
        PointF(5.0f, 2.0f);
    |]

    img.Mutate (fun x -> x.DrawPolygon(Rgba32.White, 1.0f, points) |> ignore)
    img

由于您没有提供完整的副本(甚至没有错误消息中建议的重载列表!),因此很难知道是否还有其他需要更改的地方。

答案 1 :(得分:3)

您正在传递一个点列表,但是该方法的签名需要一个点数组。我建议要么将点作为hSubmit = () => { this.setState({ id: this.state.id++, name: "", }); } 内联传递,要么将点定义为数组:

params