Как выбрать конкретную перегрузку метода?

#f#

#f#

Вопрос:

Я вызываю C # API, который использует перегрузки и необязательные параметры. К сожалению, одной из перегрузок является a params object[] , и F # выбирает ее поверх более конкретной перегрузки, которую я намерен вызвать. Как мне заставить F # выбрать нужную перегрузку?

Вот небольшая репро. И вот ссылка на фактический API.

 open System
open System.Linq.Expressions

type S =
    static member Foo(expression: Expression<Func<int>>, ?gg: string) = 
        "expression"
    static member Foo([<ParamArray>] args: obj[]) = 
        "params array"

[<EntryPoint>]
let main argv =
    // This prints "params array", but I want it to print "expression"
    let result = S.Foo(fun () -> 3, "")
    printfn "%s" result
    0
 

Ответ №1:

Чтобы вызвать версию выражения с двумя аргументами, вам нужно:

 let result = S.Foo((fun () -> 3), "")
 

В вашем коде вы фактически определили функцию, которая возвращает (3, "") кортеж, который является только одним аргументом.

Комментарии:

1. Ха-ха, это было глупо. Мне нужно было решить еще одну проблему в моем реальном коде, но это был первый шаг в правильном направлении. Спасибо.