3

C# コードで宣言された 2 つのクラスがあります。

public class A
{
     public static bool TryParse(string value, out A result)
     {
         ...
     }
}

public class B : A
{
     public static bool TryParse(string value, out B result)
     {
         ...
     }
}

C# からの呼び出しB.TryParseは問題ありませんが、正しいオーバーロードは、事前に宣言する必要がある out パラメーターの型によって決定されるためです。out パラメーターは F# の結果の一部に変換されるため、同じパラメーター シグネチャを持つ 2 つの関数を取得しました...そして、F# からの呼び出しはA unique overload for method 'TryParse' could not be determined based on type information prior to this program point. A type annotation may be needed.エラーを引き起こします。私は問題を理解しており、次のように宣言することさえありTryParseますnew...もしそれが静的でなければ。

メッセージ自体はあまり役に立ちません。どのような種類の注釈をどこに追加すればよいかがまったくわかりません。

どうすればこの電話をかけることができますか? 最もばかげた考えは、関数の 1 つの名前を変更することですが、もっと賢い方法があるのではないでしょうか?

4

2 に答える 2

4

try メソッドに渡す変数に型注釈を追加する必要があります。この場合は out 変数が変更されるためです。私はこのようなものがうまくいくはずだと思います:

let res, (b:B) = B.TryParse "MyString"

F# では、型注釈は識別子の後に続き、コロン (:) が前に付きます。

(注: F# の出力パラメーターは、結果からタプルとして復元できます)

于 2012-05-24T13:55:00.073 に答える
3

この問題を解決するには、いくつかの方法があります。

  • 明示的な型注釈を追加します (Robert が提案したように)。
  • out パラメーターから返された値を保持する変数を、関数のパラメーターが型 'B' であることが「わかっている」後の関数呼び出しの引数として使用します。これは通常、関数のパラメーターが型 'B' として明示的に宣言されている場合 (明示的な型注釈を追加することによって) に最適に機能します。
  • 静的に解決されたジェネリックを使用して、渡されたオブジェクトの TryParse メソッドを呼び出すインライン ヘルパー関数を作成します。
于 2012-05-24T14:01:06.717 に答える