2016-08-19 93 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提供的价值,并调用像这样:

changeorder.Invoke("hello world"); 
1

添加默认值的代表,以及像

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

您需要根据您的委托签名,还支持可选的参数,目前你的方法签名和委托签名不相同:

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

为了得到这个工作,你需要将可选参数添加到您的委托声明为好。代表的声明应为:

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

默认字符串可以是任何编译常量字符串值。

还应该提到,这样做意味着ReverseOrder方法不需要具有可选参数。它可以被声明为:

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

你不能那样做。代表签名只知道它自己的参数(就像接口一样)而不知道代理实现。如果您不想复制代码,则可以使委托签名接受可选字符串,并从实际方法实现中删除可选字符串。