F # - Как вызвать C # переопределенные методы с точно такими же именованными аргументами - PullRequest
0 голосов
/ 08 мая 2018

Как вызвать переопределенные методы C # с точно такими же именованными аргументами?

Пример

public static Task<CreateImageSummaryModel> CreateImagesFromDataAsync(this ITrainingApi operations, Guid projectId, IEnumerable<Stream> imageData, IList<Guid> tagIds = null, CancellationToken cancellationToken = default(CancellationToken));



public static Task<CreateImageSummaryModel> CreateImagesFromDataAsync(this ITrainingApi operations, Guid projectId, Stream imageData, IList<string> tagIds = null, CancellationToken cancellationToken = default(CancellationToken));

Те же имена методов и имена аргументов, но у аргументов разные подписи.

Теперь попытка вызвать первый метод

let uploadStreams (tag: string) (streams: Stream seq) (projectId: Guid) (trainingApi: TrainingApi) = 

    let tag = trainingApi.CreateTag(projectId, tag)

    let tags = new List<_>([tag.Id])

    let streams = streams :> IEnumerable<Stream>

    trainingApi.CreateImagesFromDataAsync(projectId, imageData = streams, tagIds = tags)

Это дает ошибку компиляции

Severity    Code    Description Project File    Line    Suppression State
Error   FS0001  The type 'IEnumerable<Stream>' is not compatible with the type 'Stream' 

Severity    Code    Description Project File    Line    Suppression State
Error   FS0193  Type constraint mismatch. The type     'IEnumerable<Stream>'    is not compatible with type    'Stream' 

Severity    Code    Description Project File    Line    Suppression State
Error   FS0001  The type 'List<Guid>' is not compatible with the type 'IList<string>'   VisionAPI   

Обычно, когда я имею дело с переопределенными методами в F #, я просто использую явные имена аргументов, такие как

let x = cls.someOverriddenMethod(arg1 = 1)

Но в этом случае это не работает.

Как мне поступить в этом случае?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Бывает, что эти определения были взяты из CustomVision API 1.0

public static Task<CreateImageSummaryModel> CreateImagesFromDataAsync(this ITrainingApi operations, Guid projectId, IEnumerable<Stream> imageData, IList<Guid> tagIds = null, CancellationToken cancellationToken = default(CancellationToken));



public static Task<CreateImageSummaryModel> CreateImagesFromDataAsync(this ITrainingApi operations, Guid projectId, Stream imageData, IList<string> tagIds = null, CancellationToken cancellationToken = default(CancellationToken));

И мое приложение F # использует версию API 1.2, в которой первый метод больше не существует (что странно)

По крайней мере, тайна раскрыта.

0 голосов
/ 08 мая 2018

Я думаю, проблема в том, что imageData не является необязательным параметром, но вы передаете его так, как будто он один. Просто передайте streams напрямую вместо использования imageData = streams. Вот минимальный рабочий пример, который компилируется для меня:

open System
open System.IO

type MyType () =
    static member A(a: string, b: Guid, c: Stream seq, ?d: Guid list) = ()
    static member A(a: string, b: Guid, c: Stream, ?d: Guid list) = ()

let f (streams: Stream seq) guids =
    MyType.A("", Guid.Empty, streams, d = guids)
    MyType.A("", Guid.Empty, streams |> Seq.head, d = guids)
...