7

我想用 C# 和 F# 编写一些东西。我有部分类,我想在其中的一些中定义 F# 方法。我得到一个部分类不能跨越 2 个 DLL 的问题。有没有办法可以合并它们?我更喜欢免费的解决方案,并且能够在正常构建中自动完成。

4

2 回答 2

6

您不能用不同的语言编写课程的不同部分。

你想做什么?

您可以在单独的 F# 库中公开方法并从 C# 中的类调用它们。
然后,您可以使用 ILMerge 合并这两个程序集。

于 2010-03-03T21:00:18.450 回答
5

我已经听到了这样的要求,所以似乎有更多的人愿意这样做。但是,正如已经说过的,这是不可能的。您可以使用 ILMerge 合并多个程序集(具有不同的类),但不可能用不同的语言编写类的不同部分。您能得到的唯一答案是您需要以不同的方式构建代码。有几种选择:

  • 声明一个 F# 模块,其中包含您想要在 F# 中执行的部分的功能
  • 在 F# 中使用成员声明类型,然后在 C# 中使用这些类
  • 在 C#(或 F#)中声明一个基类并创建一个继承类,以添加其他语言的其余功能。

在任何情况下,您都需要以某种方式解耦功能(这是技术要求,我相信这也有助于使您的代码更具可读性)。

演示为什么跨多个程序集的部分类不能工作:

// C# part
partial class Foo { 
  private int csharpField;
  int Bar() { return FSharpMethod(); }
}

// F# part
type Foo =
  member x.FSharpMethod() = x.csharpField

在这个例子中,C# 无法编译代码,因为它不知道是否FSharpMethod存在以及它的类型是什么。F# 编译器也无法编译代码,因为它不知道类型是什么csharpField(以及它是否存在)。

当然,这只是一个技术问题的一个例子,但其中会有很多——你可以很容易地想象如果你想支持这个问题会出现许多其他问题(而且看起来这两个编译器需要注意对方的内部结构)。

于 2010-03-03T21:19:58.297 回答