C# と F# の両方で何かをプログラミングしたいと考えています。部分クラスがあり、そのうちのいくつかで F# メソッドを定義したいと考えています。部分クラスを 2 つの DLL にまたがることができないという問題が発生します。それらをマージする方法はありますか?私は無料のソリューションと、通常のビルドで自動的に実行できる機能を好みます。
2 に答える
クラスの異なる部分を異なる言語で書くことはできません。
あなたは何をしようとしているのですか?
別の F# ライブラリでメソッドを公開し、C# のクラスから呼び出すことができます。
その後、ILMerge を使用して 2 つのアセンブリをマージできます。
こういう要望は以前から聞いていたので、やってみたいという方も増えているようです。しかし、すでに述べたように、これは不可能です。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
。これは、存在するかどうか、およびその型が何であるかがわからないためです。csharpField
F# コンパイラもコードをコンパイルできません。これは、型が何であるか (および存在するかどうか)がわからないためです。
もちろん、これは技術的な問題の 1 つの例にすぎませんが、問題はたくさんあります。これをサポートしたい場合に、他にも多くの問題が発生することは容易に想像できます (そして、2 つのコンパイラが認識している必要があるようです)。他のものの内部の)。