2009-03-31 9 views
3

の可変数:C#と私は、次のコードを試みたパラメータ

class Program: ProgParent 
    { 

     public int Max(params int[] op) 
     { 
      return 0; 
     } 

     public int Max(int i, params int[] op) 
     { 
      return 1; 
     } 

     public int Max(int i, int j, params int[] op) 
     { 
      return 2; 
     } 

     public static void Main(string[] args) 
     { 
      System.Console.WriteLine((new Program()).Max(5, 6, 7, 8)); 
      System.Console.ReadKey(); 
     } 
    } 

をまた実行し、利用可能な最も特定の機能を使用します。しかし、コンパイラはこれについて警告もエラーも表示しません。どうして?

+0

コードはコンパイルされません。最初の2つのメソッドシグネチャは同じです。それらのうちの1つを削除した後には問題ありません。それはなぜでしょうか? –

+0

はい、それは元のバージョンでした、私はちょうど新しいメソッドをここに追加したかった – Dutow

+0

私は基本クラス(クラスプログラムの代わりにクラスプログラム:ProgParent)を削除した後、あなたのコードはうまくいきます。私はあなたの問題がどこにあるのか分からないのですか? – Vimvq1987

答えて

4

C#言語仕様は言う:

パラメータ配列 でオーバーロード解決、方法を実行するいずれかの適用可能なその通常の形態であってもよい場合[すなわち配列を渡す]または の展開形式[ie可変数のパラメータを渡す]。 方法の正常形態が利用できない場合にのみメソッドの 拡張形式が利用可能である場合にのみ拡張フォームが既に同じタイプ」

に宣言されていない同じシグネチャを持つ方法 (やや単純化された)一言で言えば:オーバーロードの解決があいまいな場合、コンパイラは非のparamsのオーバーロードを選択し

は私が(代わりに、あなたのようなコード違法を作るの)その決定の理由を推測するには、次のとおりです

  • あなたのメソッドのシグネチャがvoid fn(params object [] p)の場合、([オブジェクト]を渡して) "通常のフォーム"を呼び出す方法があります。コンパイラはあいまいなケースを処理する必要があります。
  • 一時配列を作成するのはメソッド呼び出しよりもコストがかかります。したがって、同じように動作するがより効率的な1,2,3パラメータを持つ非paramsオーバーロードを作成したい場合があります。 (String.Formatなど)
2

ビルドエラー(これは私がタイプミスをしている)を無視しています - どのような警告が必要ですか?それは、一致する過負荷を見つけて、それを使用しています...

厳密に言えば、私は異なるオーバーロードを呼び出すことができます - 配列を渡すことによって、しかしはい、使用法は完全には明らかではありません。

paramsで複数の過負荷がない場合、このパターンはstring.Concatなど(ボンネットの下の文字列の場合は+の下にあります)などでかなり頻繁に使用されます。

+1

警告:コードは正しいです! :) – leppie

関連する問題