2013-11-23 129 views
1

我正在研究F#代碼將被其他.NET項目使用的項目 - 所以我正在使用類。我創建了一個代碼文件是這樣的:F#引用類型

namespace StockApplication 

open System 


type Stock = 
    {Symbol: String; 
    DayOpen: Decimal; 
    Price: Decimal; 
    } 

    member x.GetChange() = 
     x.Price - x.DayOpen 

    member x.GetPercentChange() = 
     Math.Round(x.GetChange()/x.DayOpen,4) 

這當我用C#編寫一些單元測試使用它工作正常。例如:

[TestMethod] 
public void CreateStock_ReturnsValidInstance() 
{ 
    Stock stock = new Stock("TEST", 10, 10.25M); 
    Assert.IsNotNull(stock); 
} 

然後我去另一個類創建另一個文件。這個班級使用第一班,所以我確保它在VS2012中的原班級以下。當我創建下一堂課時,我可以通過intellisense看到它。

namespace StockApplication 


open System 

type StockTicker() = 
    member x.GetStock() = 
     StockApplication.Stock 

然而,每一個attept要麼新的,或指它給了我同樣的錯誤:

Error 1 The value, constructor, namespace or type 'Stock' is not defined

有沒有人有任何見解,爲什麼我不能只是單純的新一輪上漲,我創建了一個類F#在另一個F#文件中?

在此先感謝。

+0

'StockTicker'與'Stock'在同一個命名空間嗎?我發現奇怪的是,你沒有在'StockApplication'上獲取錯誤,而不是'Stock'。如果它們共享,則不需要引用該命名空間。 – mydogisbox

回答

3

Stock stock = new Stock("TEST", 10, 10.25M);,如果沒有問題,編譯你的C#測試提示相信Stock的F#構造函數應該看起來一樣。但這不是真的,也許是你混淆的根源。

你原來

type Stock = 
    {Symbol: String; 
    DayOpen: Decimal; 
    Price: Decimal; } 

是F#類型Record的確實不是一個普通的類。從MSDN以下摘錄適用:

Record construction also differs from class construction. In a record type, you cannot define a constructor.

意思就是說

let stock = Stock("ABC"; 10M; 10M) 

會產生error FS0039: The value or constructor 'Stock' is not defined

let stock = { Symbol = "ABC"; DayOpen = 10M; Price = 10M; } 

將成功創建一個記錄實例。

爲了在你的第二個F#類型建立Stock類型的實例StockTicker你應該使用檔案建設的語法,像

member x.GetStock() = { Symbol = "MSFT"; DayOpen = 32M; Price = 32.5M; } 

它編譯沒有任何問題。

說到互操作使用F#記錄從C#後者遵循您在測試方法中應用的語法。

2

好的,在挖掘this引用(MSDN爲0幫助)後,我找到了答案。

下面是股票類的語法:

namespace StockApplication 

open System 


type Stock = class 
    val Symbol: String 
    val DayOpen: Decimal 
    val Price: Decimal 

    new (symbol, dayOpen, price) = 
     { 
      Symbol = symbol; 
      DayOpen = dayOpen; 
      Price = price 
     } 

    member x.GetChange() = 
     x.Price - x.DayOpen 

    member x.GetPercentChange() = 
     Math.Round(x.GetChange()/x.DayOpen,4) 


end 

這裏是針對消費類的語法:

namespace StockApplication 

type StockTicker() = 
    member x.GetStock() = 
     let y = new Stock("AET",1m,1m) 
     y.DayOpen 
+1

您在這裏混合2個問題;在你的問題中你的'Stock'類型是一個[Record](http://msdn.microsoft.com/en-us/library/vstudio/dd233184.aspx),它有特殊的構造語法,所以在F# StockTicker'應該是一個記錄,比如'member x.GetStock()= {Symbol =「MSFT」; DayOpen = 32M;價格= 32.5M; }' –