我们知道我们可以通过使用委托引用方法,并可以通过调用委托实例来调用方法。
我想通过调用delegate实例来调用一个方法(它有一个可选参数)。
我的代码在
下面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'所需的形式参数'abc'
答案 0 :(得分:3)
你做不到。委托签名只知道自己的参数(就像接口一样)而不是代理实现。如果您不想复制代码,可以使委托签名接受可选字符串,并从实际方法实现中删除可选字符串。
答案 1 :(得分:2)
要使其工作,您还需要将可选参数添加到委托声明中。代表的声明应该是:
delegate void Order(string abc = "Optional Param");
默认字符串可以是任何编译常量字符串值。
还应该提到这样做意味着ReverseOrder方法不需要具有可选参数。它可以声明为:
public static void ReverseOrder(string rev) { ... }
答案 2 :(得分:1)
委托人的签名需要设置参数。您将需要提供字符串abc的值,并像这样调用:
changeorder.Invoke("hello world");
答案 3 :(得分:1)
将默认值添加到委托中,例如
delegate void Order(string abc = "Optional Parameter");
答案 4 :(得分:1)
您需要代理签名也支持可选参数,目前您的方法签名和委托签名不相同:
delegate void Order(string abc="");