F#命名空间/模块与C#的互操作性

3
我一直在尝试使用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是该类的一个静态成员。
1个回答

10

这并不是因为F#中命名空间和类的行为方式导致的,您理解得没错。

问题在于您有一个名为File1的命名空间和一个名为File1的类。当您在C#程序中写File1时,即使您正确使用了using,它的含义也是“命名空间File1”,而不是“类File1.File1”。例如,如果您将命名空间的名称更改为FileNamespace并将type的名称更改为FileType,则一切都会按预期工作。(我并不是说您应该在实际项目中使用这样的命名方式。)


有道理。将其中一个名称更改为File就可以了。 - Jonathan Sternberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接