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)
|]
我看到几个问题:
- 正如 Aaron 所说,您正在传递一个需要数组的列表。
DrawPolygon
的第二个参数应该是 float32
,而不是 float
。请注意,不是调用 float32
函数,而是可以通过添加后缀来使用正确类型的文字:1.0f
.
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
由于您没有包含完整的重现(甚至没有包含错误消息中建议的重载列表!),所以很难知道是否还有其他需要更改的地方。
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)
|]
我看到几个问题:
- 正如 Aaron 所说,您正在传递一个需要数组的列表。
DrawPolygon
的第二个参数应该是float32
,而不是float
。请注意,不是调用float32
函数,而是可以通过添加后缀来使用正确类型的文字:1.0f
.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
由于您没有包含完整的重现(甚至没有包含错误消息中建议的重载列表!),所以很难知道是否还有其他需要更改的地方。