f#名称空间/模块和与c#的互操作

本文关键字:互操作 模块 空间 | 更新日期: 2023-09-27 18:03:33

我一直在尝试使用f#,并想尝试在c#项目中使用它来编写某些代码片段,从而受益于该语言。

我一直在试图弄清楚模块和命名空间在c#项目中使用时是如何工作的。例如,下面的代码:

namespace File1
#light
type File1(path : string) =
    static member Trim(p : string) = p.Trim()
    member self.Path = path

然后我试着在c#中这样使用:

using File1;
class Program
{
    static void Main(string[] args)
    {
        // Doesn't work
        Console.WriteLine(File1.Trim(" hello "));
        // Does work
        Console.WriteLine(File1.File1.Trim(" hello "));
    }
}

我明白为什么第二个工作,但为什么第一个不工作?我用using声明拉入了名称空间,File1应该是一个类。Trim是该类的静态成员。

f#名称空间/模块和与c#的互操作

这不是由f#中的名称空间和类的行为方式引起的,您做对了。

问题是您有一个名为File1的名称空间和一个名为File1的类。当您在c#程序中编写File1时,即使您有正确的using,它也意味着"命名空间File1",而不是"类File1.File1"。例如,如果将名称空间的名称更改为FileNamespace,将type的名称更改为FileType,则一切都将按预期工作。(我不是说你应该在你的实际项目中使用这样的命名。)