Компилятор F # дает ошибку, говоря, что я должен добавить ссылку на проект, потому что тип, который я использую, имеет аргумент метода, который живет в этом проекте. Но этот метод является приватным!
У меня есть следующая структура проекта:
Программа → Библиотека → SubLibrary
SubLibrary содержит следующее:
namespace SubLibrary
type Widget = { Value: int }
Библиотека содержит следующее:
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
на класс, а не на запись, но это не имело значения.
В качестве эксперимента я создал версию библиотеки С#, называемую библиотекой:
using SubLibrary;
namespace CLibrary {
public class CBanana {
int m_value;
public CBanana(int value) {
m_value = value;
}
private void TakeWidget(Widget w) {
}
}
}
Затем я изменил программу на использование CBanana
вместо Banana
:
open Library
[<EntryPoint>]
let main argv =
printfn "%A" argv
let banana = CBanana 42
0
Теперь я не получаю сообщение об ошибке. На самом деле, с С# я могу сделать этот метод общедоступным, и пока я не пытаюсь скомпилировать его, нет ошибки.
Почему компилятор настаивает на добавлении ссылки на SubLibrary? Конечно, я мог бы просто пойти и сделать то, что он мне сказал, для спокойной жизни, но SubLibrary - это частная деталь реализации библиотеки, которая не должна подвергаться программе.