Я думаю, что это действительно очень хороший вопрос.Я не нашел лучшего обходного пути для этого.Вы можете немного упростить ваш обходной путь, используя typedefof
, например:
let typeDef = typedefof<DataProviderBase<DummyProvider>>
ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ
Проблема в том, что F # * typedefof<'T>
- просто обычная функцияэто принимает аргумент типа (в отличие от typeof
в C #, который является оператором).Чтобы вызвать его, вам нужно присвоить ему фактический тип, а затем функция вызовет GetGenericTypeDefinition
под обложкой.
Причина, по которой typedefof<option<_>>
работает, заключается в том, что F # задает по умолчанию введите в качестве аргумента (в данном случае obj
).В общем, F # выбирает менее конкретный тип, который соответствует ограничениям.В вашем случае:
DataProviderBase<_>
станет DataProviderBase<DataProviderBase<_>>
и т. Д.
Если вы не определите новый тип (как в вашем обходном пути), конкретный тип * отсутствует1025 *, который можно использовать в качестве аргумента типа typedefof<...>
.В этом случае механизм по умолчанию просто не работает ...