F#编译器给出错误提示,说我必须添加一个项目引用,因为我使用的类型具有在该项目中存在的方法参数。 但是,这个方法是私有的!
我的项目结构如下:
程序 -> 库 -> 子库
子库 包含以下内容:
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
改为类而不是记录,但这没有任何区别。
作为一个实验,我创建了一个C#版本的Library,名为CLibrary:
using SubLibrary;
namespace CLibrary {
public class CBanana {
int m_value;
public CBanana(int value) {
m_value = value;
}
private void TakeWidget(Widget w) {
}
}
}
然后我将Program更改为使用CBanana
而不是Banana
:
open Library
[<EntryPoint>]
let main argv =
printfn "%A" argv
let banana = CBanana 42
0
现在我没有错误了。实际上,使用C#,我可以将该方法设置为public,只要我不尝试编译调用它,就不会出错。
为什么编译器坚持要我添加对SubLibrary的引用?当然,我可以按照它告诉我的去做,过上安静的生活,但是SubLibrary是Library的私有实现细节,不应该暴露给Program。
Banana
是一个类,你可以编译调用构造函数,但是如果你尝试访问公共的Value
属性,那时候你会得到错误。在我的情况下,我需要这个方法是内置的,因为它需要使用反射来发现,所以可选的扩展对我来说不好。谢谢你的回复。 - bananasareyellowinternal
”。 - kaefer