Задать вопрос
@to_east

Несовместимость сигнатуры функции?

Нужно чтобы клиент некой библиотеки подключался через соксы, библиотека написана на C#.
Но сначала я хотел переписать обработчик(по умолчанию) на F# и передать в свойство.
Вобщем код:
// Обработчик по умолчанию
static async Task<TcpClient> DefaultTcpHandler(string host, int port)
{
    var tcpClient = new TcpClient();
    await tcpClient.ConnectAsync(host, port);
    return tcpClient;
}

// Инициализация класса Client с обработчиком по умолчанию
public TcpFactory TcpHandler { get; set; } = DefaultTcpHandler;
public delegate Task<TcpClient> TcpFactory(string host, int port);


Обработчик переписанный на F#

let defaultTcpHandler (host : string, port : int) : Async<TcpClient> =
    async {
        let tcpClient = new TcpClient()
        let! _ = tcpClient.ConnectAsync(host, port) |> Async.AwaitTask
        return tcpClient
    }

// Инициализация клиента и установка обработчика через сеттер
let client = new Client(...)
client.TcpHandler <- defaultTcpHandler


Ошибка в несвовместимости типов в последней строчке кода:
This expression was expected to have type
    'Client.TcpFactory'
but here has type
    'string * int -> Async<TcpClient>'
  • Вопрос задан
  • 41 просмотр
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@to_east Автор вопроса
Кажется дошло. Нужно передавать обработчик в атрибут, предварительно завернув обработчик в делегат:
let defaultTcpHandler (host : string) (port : int) : Task<TcpClient> =
    task {
        let tcpClient = new TcpClient()
        let! _ = tcpClient.ConnectAsync(host, port) |> Async.AwaitTask
        return tcpClient
    }

client.TcpHandler <- Client.TcpFactory(defaultTcpHandler)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы