2016-08-19 4 views
1

デリゲートを使用してメソッドを参照できることがわかっており、デリゲートのインスタンスを呼び出すことでメソッドを呼び出すことができます。デリゲートのインスタンスによってオプションのパラメータを持つメソッドを呼び出す

デリゲートのインスタンスを呼び出してメソッド(オプションのパラメータがあります)を呼び出す必要があります。

私のコードは

using System; 

namespace Testing_Delegates 
{ 
    class Program 
    { 
     delegate void Order(string abc); 
     public static void ReverseOrder(string rev = "Optional Param") 
     { 
      char[] elements = rev.ToCharArray(); 
      char[] reversed = new char[rev.Length]; 
      for(int i = 0; i < rev.Length; i++) 
      { 
       reversed[i] = elements[rev.Length - (i+1)]; 
      } 
      foreach(char element in reversed) 
      { 
       Console.Write(element); 
      } 
     } 


     static void Main(string[] args) 
     { 
      Order changeorder = new Order(ReverseOrder); 
      changeorder();//------Here is error------------ 
     } 
    } 
} 

エラーが

'Program.Order'

+0

[代理人はオプションのパラメータを持つことができますか?](http://stackoverflow.com/questions/3763037/can-a-delegate-have-an-optional-parameter) – sr28

答えて

1

の必要な仮パラメータ 'ABC' に対応して与えられた引数はありませんです下回っています代理人の署名では、パラメータを設定する必要があります。あなたは、文字列abcの値を提供し、またそのように起動する必要があります。

delegate void Order(string abc = "Optional Parameter"); 
1

は、同様デリゲートにデフォルト値を追加します。パラメータ、現在お使いのメソッドシグネチャとデリゲートシグネチャは同じではありません。

delegate void Order(string abc=""); 
1

のようにあなたはまた、オプションをサポートするために、デリゲートの署名を必要とする

changeorder.Invoke("hello world"); 
2

が、これはあなたが同様にあなたのデリゲートの宣言にオプションのパラメータを追加する必要が動作するように取得するには。デリゲートの宣言は、次のようにする必要があります。

delegate void Order(string abc = "Optional Param"); 

デフォルトの文字列は、任意のコンパイル定数の文字列値にすることができます。

これは、ReverseOrderメソッドがオプションのパラメータを持つ必要がないことを意味することにも言及してください。

public static void ReverseOrder(string rev) { ... } 
3

あなたはそれを行うことはできません。デリゲートの署名は、デリゲートの実装ではなく、独自のパラメータ(インターフェイスと同様)のみを知っています。コードを複製したくない場合は、代理署名にオプションの文字列を受け入れ、実際のメソッド実装からオプションの文字列を削除することができます。

関連する問題