2014-11-28 2 views
10

F # 컴파일러는 사용중인 형식에 해당 프로젝트에있는 메서드 인수가 있기 때문에 프로젝트 참조를 추가해야한다는 오류를 제공합니다. 하지만이 방법은 비공개입니다!F # 컴파일러는 프로젝트 참조가 필요하지만 메서드가 private이어야합니다.

나는 다음과 같은 프로젝트 구조가 있습니다

프로그램 -> 도서관 ->

서브 라이브러리이 포함되어 서브 라이브러리 :

namespace SubLibrary 

type Widget = { Value: int } 

도서관가 포함이 :

,210
namespace Library 

open SubLibrary 

type Banana = 
    { Value: int } 

    member private x.TakeWidget (w: Widget) =() 

프로그램이 포함되어 있습니다

open Library 

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 

    let banana = { Value = 42 } 
    0 

내가이 오류 :

error FS0074: 
The type referenced through 'SubLibrary.Widget' is defined in an assembly that is not referenced. 
You must add a reference to assembly 'SubLibrary' 

그러나 TakeWidget 방법은 개인입니다!

나는 레코드가 아닌 클래스로 Banana을 변경하려고 시도했지만 아무런 차이가 없었습니다.

open Library 

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 

    let banana = CBanana 42 
    0 

:

using SubLibrary; 

namespace CLibrary { 
    public class CBanana { 
     int m_value; 

     public CBanana(int value) { 
      m_value = value; 
     } 

     private void TakeWidget(Widget w) { 
     } 
    } 
} 

가 그럼 난 CBanana 대신 Banana를 사용하는 프로그램을 변경 : 실험으로

, 나는 CLibrary라는 도서관의 C# 버전을 만들었 이제는 오류가 발생하지 않습니다. 실제로 C#을 사용하면 해당 메서드를 공용으로 만들 수 있으며 호출을 컴파일하지 않을 경우 오류가 없습니다.

왜 컴파일러에서 SubLibrary에 대한 참조를 추가한다고 주장합니까? 물론, 조용한 삶을 위해서 내가해야 할 일을 할 수는 있지만, 서브 라이브러리라이브러리의 개인 구현 세부 사항이며 프로그램에 노출되어서는 안됩니다. - 당신은 private 멤버를 이동해야

type BananaClass (value:int) = 
    member private x.TakeWidget (w: Widget) =() 
    member x.Value = value 

당신은뿐만 아니라 기록으로 해결할 수 있습니다 내가 대신 기록의 클래스를 시도 할 때

답변

2

사실, 그것은 트릭 (F 번호 3.1)했다 별도의 모듈로 형의 증가로 가지고 : 당신이 Ext 모듈을 열 때까지

type Banana = { Value: int } 

module Ext = 
    type Banana with 
     member x.TakeWidget (w: Widget) =() 

컴파일러가 누락 된 의존성에 대해 불평하지 않습니다.

왜 컴파일러가 처음부터 불평하는지 잘 모르겠습니다. 아마 그 단점 중 하나. 생성 된 일리노이에서 의심스러운 것을 발견 할 수 없었습니다. (F # 컴파일러가 사내 및 내부 구성원을 일리노이 내부로 표시한다는 놀라운 사실 이외에는 여기에 아무런 결과가 없음이 드러났습니다.)

+0

저는 F # 3.1 (VS 2013)도 사용하고 있습니다. 'Banana'가 클래스 인 경우에는 생성자에 대한 호출을 컴파일 할 수 있지만 공개 된'Value' 속성에 액세스하려고하면 오류가 발생합니다. 필자의 경우에는 리플렉션을 사용하여 발견해야하기 때문에 메서드가 내장되어 있어야하므로 선택 확장은 나에게 좋지 않습니다. 답장을 보내 주셔서 감사합니다. – bananasareyellow

+0

다소 놀랍지는 않지만, "비공개 엔티티의 CLI 컴파일 형식은 '내부'입니다." – kaefer