F# вызов.NET Функция с общими параметрами - не будет компилироваться
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 ответа
Решение
Я вижу несколько вопросов:
- Как сказал Аарон, вы передаете список, где требуется массив.
- Второй аргумент
DrawPolygon
должен бытьfloat32
неfloat
, Обратите внимание, что вместо вызоваfloat32
Функция, вы можете просто использовать литерал правильного типа, добавив суффикс:1.0f
, - Второй аргумент
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
Поскольку вы не включили полное воспроизведение (или даже список предлагаемых перегрузок из сообщения об ошибке!), Трудно понять, нужно ли что-то еще изменить.
Вы передаете список точек, но сигнатура метода ожидает массив точек. Я бы предложил либо передать точки в линию, как 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)
|]