2

この質問はワームの缶詰だと感じていますが、とにかく質問します... :)

私は方法を持っています:

private MembershipUser GetUserFromReader(SqlDataReader reader)

そして、このメソッドを別の戻り値の型でオーバーロードしたい:

private User GetUserFromReader(SqlDataReader reader)

しかし、コンパイラは、2 つのメソッドが同じシグネチャを持っていると文句を言います。

それで、これを行う最善の方法は何ですか?メソッドのシグネチャを変更するためだけに、不要なパラメーターを追加しないことをお勧めします。

私は次のようなことをするという考えで遊んだ:

private User GetUserFromReader(T reader)

しかし、これについてはまだ完全に調査していません。リーダー オブジェクトの使用方法を変更する必要があるようです。

何か案は?同じシグネチャのオーバーロードされたメソッドが 2 つある場合のベスト プラクティスは何ですか?

助けてくれてありがとう...

4

5 に答える 5

6

なぜそれを過負荷にするのですか?次のように、メソッドにそれが何をするかを言わせてはいけません:

private MembershipUser GetMembershipUserFromReader(SqlDataReader reader)
private User GetUserFromReader(SqlDataReader reader)
于 2010-02-10T22:56:14.580 に答える
5

リターンタイプを本当に区別したいが、同じメソッドシグネチャを使用する場合は、ジェネリックを使用できます。

private T GetUserFromReader<T>(SqlDataReader reader)

しかし、ルーマンの答えのように、メソッドの名前を変更する方がはるかに簡単です。

于 2010-02-10T23:00:37.050 に答える
2

あなたの唯一の本当のオプションは次のとおりです。

  1. 関数の名前を変更する
  2. 関数のシグネチャを変更する

陳腐なことは嫌いますが、戻り値の型だけでメソッドを区別するという制限を回避する方法はありません。

オーバーロードの 1 つが親クラスで宣言されている場合、newキーワードを使用して呼び出し元から上位のメソッドを「隠す」ことができますが、new(メンバー宣言では) 通常は悪と見なされます。

于 2010-02-10T22:55:26.270 に答える
1

オーバーロードで戻り値の型を変更することはできません。コンパイラは、どちらを使用するかをどのように判断する必要がありますか?

あなたがすべきことは、あなたが返したいと思うかもしれないすべてのものの共通のスーパークラスを返し、それから適用可能なものは何でも返すことです.

それか、メソッドの名前が異なるかのどちらかです。メソッドは明らかに異なることをするからです。

于 2010-02-10T22:55:05.647 に答える
1

簡単な答えは、C# に関する限り、できないということです。戻り値の型によるオーバーロードは、MSIL では許可されていますが (私はそう思います)、C# では許可されていません。

唯一の現実的な選択肢 (つまり、「ダミー」パラメーターの追加を除く)​​ は、一方のメソッド GetMembershipUserFromReader を呼び出し、もう一方のメソッド GetUserFromReader を呼び出すことです。

于 2010-02-10T22:55:31.727 に答える