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 ответа

Решение

Я вижу несколько вопросов:

  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

Поскольку вы не включили полное воспроизведение (или даже список предлагаемых перегрузок из сообщения об ошибке!), Трудно понять, нужно ли что-то еще изменить.

Вы передаете список точек, но сигнатура метода ожидает массив точек. Я бы предложил либо передать точки в линию, как 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)
    |]
Другие вопросы по тегам