Приведение obj к универсальному интерфейсу F # - PullRequest
1 голос
/ 14 ноября 2011

Я пытаюсь привести объект к универсальному интерфейсу, который выглядит примерно так:

type IFetchData<'a> = 
     abstract FetchData: string -> seq<'a>

Однако мой пример использования выглядит в FSI следующим образом:

let sample = new Sample()
let box_sample = box(sample) //simulate reflection type that implements interface
let result = unbox<IFetchData<_>>(box_sample) //value restriction
let result2: IFetchData<_> = unbox<IFetchData<_>>(box_sample) //value restriction

Я пытаюсь добиться динамического вызова члена типа FetchData.поэтому, как только я получу тип IFetchData <_>, я бы хотел вызвать элемент FetchData без необходимости знать, каков на самом деле универсальный тип.

Полученная ошибка - ошибка ограничения значения.Любая помощь будет оценена.

Спасибо.

1 Ответ

2 голосов
/ 14 ноября 2011

Вы не можете иметь общие термины, просто сидя без дела - но если компилятор может вывести конкретный тип, у вас все в порядке. В качестве альтернативы, как говорится в сообщении об ошибке, вы можете преобразовать в функцию, подобную этой:

let result() = unbox<IFetchData<_>>(box_sample)

В противном случае вам нужен конкретный тип для результата, как

let result2 = unbox<IFetchData<char>>(box_sample)

хотя, здесь вам нужно заранее знать, что вы распаковываете

в качестве альтернативы, если код может выводить конкретный тип позже, в зависимости от вашего использования, у вас все будет в порядке.

...