2013-11-23 2 views
1

다른 프로젝트에서 F # 코드를 사용하는 프로젝트에서 작업 중이므로 클래스를 사용하고 있습니다. 나는 C#으로 작성된 일부 단위 테스트에서 소비 할 때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) 

이 잘 작동 :이 같은 코드 파일을 만들었습니다. 예 :

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

다른 클래스로 다른 파일을 만들었습니다. 이 클래스는 1 클래스를 사용하므로 VS2012의 원래 클래스 아래에 있는지 확인했습니다. 다음 수업을 만들었을 때 나는 인텔리 센스를 통해 그것을 볼 수 있습니다. 그러나

namespace StockApplication 


open System 

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

에 모든 attept 중 새 것이거나 나에게 같은 오류가 있습니다 참조 :

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

은 다른 사람이 어떤 통찰력을 가지고 있습니까 왜 내가 할 수있는 I에서 만든 최대 단순히 새로운 클래스 다른 F # 파일에서 F #?

미리 감사드립니다.

+0

'StockTicker'는'Stock'와 동일한 네임 스페이스에 있습니까? 나는'Stock'보다는'StockApplication'에 오류가 발생하지 않는다는 것이 이상하다는 것을 알게되었습니다. 네임 스페이스를 공유하는 경우 네임 스페이스를 참조 할 필요가 없습니다. – 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; } 

동안 생산합니다 것을 의미한다. 아무 문제없이 컴파일

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

같은 당신이 기록 건설 구문을 사용한다 StockTicker 두 번째 F 번호 유형 유형 Stock의 인스턴스를 구축하기 위해

, 뭔가.

C#에서 F # 레코드의 interop 사용에 관해서는 후자가 테스트 방법에 적용한 구문을 따릅니다.

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 가지 문제가 혼합되어 있습니다. 귀하의 질문에 '주식'유형은 [기록] (http://msdn.microsoft.com/en-us/library/vstudio/dd233184.aspx)이며, 구문에 대한 특수 구문이 있으므로 F # StockTicker'는'member x.GetStock() = {Symbol = "MSFT"; DayOpen = 32M; 가격 = 32.5M; }' –