F# 使用通用参数调用 .Net 函数 - 无法编译

F# call .Net Function with generic params - wont compile

F#初学者,我想用ImageSharp画一个多边形。构建失败:

No overloads match for method 'DrawPolygon'. The available overloads are shown below. error FS0001: This expression was expected to have type 'Image' but here has type '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>

您正在传递一个点列表,但该方法的签名需要一个点数组。我建议将点作为 params 在线传递,或者将点定义为数组:

let points = 
    [|
        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)
    |]

我看到几个问题:

  1. 正如 Aaron 所说,您正在传递一个需要数组的列表。
  2. DrawPolygon 的第二个参数应该是 float32,而不是 float。请注意,不是调用 float32 函数,而是可以通过添加后缀来使用正确类型的文字:1.0f.
  3. Mutate 的第二个参数需要是 Action<_>,所以它不应该 return 任何东西;这意味着您应该忽略 DrawPolygon 调用的结果而不是 returning 它。您可以通过在调用后放置 |> 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

由于您没有包含完整的重现(甚至没有包含错误消息中建议的重载列表!),所以很难知道是否还有其他需要更改的地方。