5

パラメータは同じだが意味が異なる 2 つの同じ関数名を使用できますか?

例えば:

public void test(string name) 

public void test(string age) 

ありがとうございました。

4

7 に答える 7

4

いいえ、できません。署名は同じです - パラメータ名が何であるかは問題ではありません。

クラスまたは構造体でメソッドを宣言するには、public または private などのアクセス レベル、abstract または seal などのオプションの修飾子、戻り値、メソッドの名前、および任意のメソッド パラメーターを指定します。これらの部分が一緒になって、メソッドの署名になります。

http://msdn.microsoft.com/en-us/library/ms173114.aspx

他のいくつかの回答が述べているように、取り込んでいるデータの種類を考慮してください。名前は確かに典型的な文字列ですが、年齢はそうでなければなりませんか? たとえば、それを許可する場合int、必要に応じてメソッドをオーバーロードできます。

于 2012-09-14T09:39:04.607 に答える
3

いいえ、戻り値の型またはパラメーター名をオーバーロードすることはできません。他の一部の言語 (特に Objective C 1 ) とは異なり、パラメーター名は関数の署名の一部ではありません。

メソッドのシグニチャーは、メソッドの名前と、その各仮パラメーターの型と種類 (値、参照、または出力) で構成され、左から右の順序で考慮されます。メソッドのシグネチャには、特に戻り値の型が含まれていません。また、一番右のパラメーターに指定できる params 修飾子も含まれていません。


1セレクターの一部になるのは、正確にはパラメーター名ではありません。

于 2012-09-14T09:39:23.577 に答える
2

同じ名前の静的メソッドと非静的メソッドを使用できますが、メソッドのオーバーロードと同じ規則に従ってパラメーターが異なるため、まったく同じシグネチャを持つことはできません。

于 2012-09-14T09:39:46.143 に答える
1

オプションのパラメータとデフォルト値を使用して、これらのメソッドを組み合わせることができます。

public void test(string name = null, string age = null)
{
  if (name != null) 
  {
     // Do something
  }
  else if (age != null)
  {
     // Do something else
  }
}

そして、このメソッドを次のように呼び出すことができます。

test(name: "John");
test(age: "30");

あまりきれいではありませんが、それでも使用できます。

于 2012-09-14T09:43:31.070 に答える
1

No. 署名とオーバーロード

別の意味を持つメソッドが必要な場合、なぜ別の名前のメソッドを作成しないのでしょうか? 同じオブジェクトの異なるものに同じメソッド名を使用すると混乱します。

于 2012-09-14T09:39:23.317 に答える
0

いいえ - コンパイラは、戻り値の型ではなく、パラメーターを使用して呼び出すメソッドを決定するため、エラーをスローします。

于 2012-09-14T09:51:25.047 に答える
0

番号。

OVERLOADED FUNCTIONには異なる SIGNATURE が必要です。つまり、引数は、引数の数または異なるデータ型の引数の順序に関して、異なる必要があります。

于 2014-04-08T12:12:26.930 に答える