2016-10-01 31 views
2

我有一個定義模塊的F#庫。模塊內部定義了2種類型。我正在從C#項目訪問庫(目前它只是一個測試項目,儘管這可能沒有關係)。在F#模塊中定義了兩種類型,但只有一種在C#中可見#

我可以訪問C#中的其中一個類型,但另一個不可用。

我下面的F#代碼:

module Stock 

open FSharp.Data 
open InstrumentQueryBuilder 

type Stock = CsvProvider<"..\prototype_historical_data.csv"> 

type StockData(symbol) = 
    member this.Symbol = symbol 
    member private this.QueryBuilder = new InstrumentQueryBuilder(this.Symbol) 
    member this.LoadData() = 
     this.QueryBuilder.HistoricalData() |> Stock.Load 
    // more member definitions here... 

從C#我可以看到StockData但不Stock。來自FSharp.Data的StockCsvProvider。在我的C#代碼中,我引用了FSharp.Data和FSharp.Core。

在C#中使用StockData是如此簡單:

var stockData = new Stock.StockData("SPY"); 

但是,如果我爲Stock做同樣的它顯示了一個編譯時錯誤。任何建議如何訪問Stock類型或解釋爲什麼這是不可能的?

+1

'Stock'類型是一種提供的類型:它來自F#類型的提供者。類型提供程序由F#編譯器運行,並構造一個類型並將其交給編譯器。因此,如果你沒有運行F#編譯器(因爲你在做C#工作),在我看來,類型提供程序不會運行,因此庫存類型將不可用。 OTOH,我想這些DLL會包含'Stock'類型,所以這個解釋可能是錯誤的。但我最好的猜測是,答案歸結爲「類型提供者是特殊的」。 – rmunn

+2

可能的[如何創建可以從C#使用的F#類型提供程序?]的重複項(http://stackoverflow.com/questions/12118866/how-do-i-create-an-f-type-provider-那可以使用從c) –

+0

@rmunn您的評論對我有意義。我同意問題必須與類型提供者。如果你做出答案,我會很樂意接受。 – PiotrWolkowski

回答

1

在F#中,type對它有很多意義,即使它們看起來都很相似。

在你的情況下,

股票 - 類型的縮寫(別名)。 不是第一類對象。這就是爲什麼它不可見的C#。

StockData - 它是類。具有用作構造函數的名稱後面的函數式參數列表。

相關問題