2016-11-28 26 views
10

から指定したメソッドを上げるF#で使用がサポートされていない例外は、私が使用してF#で、この一般的な機能を持っていますC#の:演算子( - - )()演算子C#

int a = sub<int, int, int>(4, 1);

これは、エラーが発生します。

Unhandled Exception: System.NotSupportedException: Specified method is not supported. at ProjA.MainClass.Main (System.String[] args) [0x00000] in <4f209fa43741462db3b8f73ac83c35a2>:0 [ERROR] FATAL UNHANDLED EXCEPTION: System.NotSupportedException: Specified method is not supported. at ProjA.MainClass.Main (System.String[] args) [0x00000] in <4f209fa43741462db3b8f73ac83c35a2>:0

これは、(+)演算子またはインラインキーワードなしでうまく動作することに注意してください。

1)何か間違っているのですか?これはバグですか?

2)この問題を解決する方法はありますか(ただし、この関数を汎用化するにはインラインキーワードが必要です)。

3)C#からf#関数を呼び出すときに似たような経験がありましたか?どのように解決しましたか?

私はmacOS SierraでMono 4.8を使用しています。

+0

@EJoshuaSコンパイラは、3つのパラメータ、つまり戻り型の最後のパラメータを強制します。型引数は、コンパイラによって自動的に推論することはできません。私が言及したように、奇妙なことは、( - )を(+)に変更すると、例外なくすべてが正常に機能するということです。 – mateuszlewko

+0

はい、私の前のコメントを無視してください、私は一度それを自分で試してみました。私はそのような種類の行動にも少し驚いている(私はマシンで全く同じことを見た)。明らかに、C#からF#に呼び出すときには、 "インライン"キーワード[ちょっと変なことがあります](http://stackoverflow.com/questions/4413324/how-does-f-inline-work) - 実際には、インライン関数では正しく動作しますが、なぜこれが "+"ではなく " - "で動作するのか少し困惑します。私は実際に誰かが知っている場合、なぜこれも理由についての説明を見たいと思っています。 – EJoshuaS

+1

私はこれがうまくいくことにも驚いています。+あなたが+を使用すると、あなたはおそらく他の何かの定義を隠していると思われます。インラインでは、F#コンパイラは実際に関数を作成しません。それは、使用できるメタデータを作成するだけです。したがって、C#コンパイラがそれを全く見ないという事実は驚くべきことです –

答えて

7

一般に、inlineとして宣言された関数は、他の言語から使用できません(またはF#と同じように動作しません)。コールサイトでは、C#やその他のCLR言語でサポートされていないF#コンパイラの機能として置き換えられます。これは、これらの他の言語よりもF#の大きな利点です。

ただし、いくつかの例外があります。実行時の型に基づいてディスパッチを実行するF#インライン関数を記述することができます。この関数は、C#や他の言語から使用できます。通常、これらはC#から使用されるときにF#から特定の型(プリミティブ型の特定のハンドラは処理されない)と同じILを取得しません。このため、(+)が動作します。this in the code for the operatorが表示されます。(+)は、​​となります。 (-)is missing the runtime dispatched versionに明示されており、明示的には[<NoDynamicInvocation>]とマークされているため、C#からはうまく動作しません。

これは、長年にわたり人々がIArithmetic(*インターネットアーカイブを使用しているため、Connectで非表示になっているなど)を要求する原因となったC#の事実上同じ制限です。 F#はstatically resolved type parametersでこれを回避しますが、これはF#に固有の機能であり、C#やその他の言語では機能しません。 F#で関数をラップしても、C#ではその関数が有効になりません。