F # 컴파일러는 사용중인 형식에 해당 프로젝트에있는 메서드 인수가 있기 때문에 프로젝트 참조를 추가해야한다는 오류를 제공합니다. 하지만이 방법은 비공개입니다!F # 컴파일러는 프로젝트 참조가 필요하지만 메서드가 private이어야합니다.
나는 다음과 같은 프로젝트 구조가 있습니다
프로그램 -> 도서관 ->
서브 라이브러리이 포함되어 서브 라이브러리 :
namespace SubLibrary
type Widget = { Value: int }
도서관가 포함이 :
,210namespace 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
당신은뿐만 아니라 기록으로 해결할 수 있습니다 내가 대신 기록의 클래스를 시도 할 때
저는 F # 3.1 (VS 2013)도 사용하고 있습니다. 'Banana'가 클래스 인 경우에는 생성자에 대한 호출을 컴파일 할 수 있지만 공개 된'Value' 속성에 액세스하려고하면 오류가 발생합니다. 필자의 경우에는 리플렉션을 사용하여 발견해야하기 때문에 메서드가 내장되어 있어야하므로 선택 확장은 나에게 좋지 않습니다. 답장을 보내 주셔서 감사합니다. – bananasareyellow
다소 놀랍지는 않지만, "비공개 엔티티의 CLI 컴파일 형식은 '내부'입니다." – kaefer