2013-04-22 1 views
4

Можем ли мы встраивать тип взаимодействия в F #?Вставить типы взаимодействия в F #

Сначала я не вижу возможности сделать это в ссылках.

Во-вторых, если я вставлять тип в C#, он говорит мне, чтобы ссылаться на интерфейс, а не конкретный класс:

//DBEngine is the interface DBEngineClass is the concrete class 

//if I dont embed the interop 

//Valid 
var dbe = new Microsoft.Office.Interop.Access.Dao.DBEngineClass(); 
//Valid 
var dbe = new Microsoft.Office.Interop.Access.Dao.DBEngine(); 


//if I do embed the interop 
//Invalid 
var dbe = new Microsoft.Office.Interop.Access.Dao.DBEngineClass(); 
//Valid 
var dbe = new Microsoft.Office.Interop.Access.Dao.DBEngine(); 

Однако F # всегда хочет иметь ссылку на конкретный класс. Есть ли способ обойти это?

ответ

1

Может быть, я не понимаю ваш вопрос, но это работает отлично, ссылающийся v14.0:

open Microsoft.Office.Interop.Access.Dao 
let dbe = DBEngineClass() :> DBEngine 
+0

Это действительно так, но вы по-прежнему поручаете бинарному на самом деле привязываться к определенному классу версии v14.0. COM имеет это понятие интерфейса, которое, по-видимому, сейчас появляется на уровне языка в C#. поэтому вы можете создавать новые ... интерфейс! – nicolas

+0

Идея состоит в том, что я не забочусь о том, какая клиентская библиотека реализует интерфейс. Я подталкиваю эту родословную до среды выполнения, которая отвечает за ее соблюдение. – nicolas

2

Тао Лю говорит о некоторой дополнительной работы, которую вы должны сделать из F #, чтобы открыть правильный класс создать экземпляр here. Насколько я знаю, нет способа встраивать типы взаимодействия. Я был бы рад оказаться ошибочным. :)