Как сохранить тип как generi c в f #? - PullRequest
0 голосов
/ 18 июня 2020

Я борюсь с настройкой функции f #, чтобы она могла принимать тип (от c#) Dictionary<keys, dynamic>, где ключи - это просто тип enum, а c - это тип scruct, который содержит параметры.

Моя функция f # выглядит так:

    let func (stores: Dictionary<keys, 'values>) =

        let newObj1State = object1.addOne(stores.[keys.0])
        let newObj2State = object2.addOne(stores.[keys.1])

        let newSystemState = new Dictionary<keys, 'values>()
        newSystemState.Add(keys.0, newObj1State);
        newSystemState.Add(keys.1, newObj2State);
        newSystemState

Проблема, с которой я столкнулся, заключается в том, что, когда компилятор f # запускает функцию, он видит, что 'values сначала упоминается как тип Object1 поэтому он предполагает, что 'values имеет тип Object1, и выдает эту ошибку вызывающей команде.

cannot convert from 'System.Collections.Generic.Dictionary<Types.keys, dynamic>' to 'System.Collections.Generic.Dictionary<Types.keys, Types.Object1>

Есть ли способ сохранить 'values как generi c, чтобы он не выводил тип данных из кода?

1 Ответ

0 голосов
/ 18 июня 2020

Метод object1.AddOne, вероятно, ожидает Object1 в качестве аргумента, который заставляет компилятор вывести тип значений `как Object1. В этом случае вы можете просто заменить object1.AddOne(stores.[keys.0]) на object1.AddOne(box stores.[keys.0]).

Функция box в основном сообщает компилятору «преобразовать то, что я даю вам, в obj». Преобразование чего-либо перед передачей в addOne позволяет компилятору знать, что он не должен предполагать, что тип значений `точно соответствует сигнатуре addOne.

...