[英]Calling a method with optional parameter by delegate’s instance
我们知道可以使用委托来引用方法,也可以通过调用委托的实例来调用方法。
我想通过调用委托实例来调用方法(具有可选参数)。
我的代码如下
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”相对应的参数
你不能那样做。 委托签名仅知道其自身的参数(就像Interface一样),而不知道委托实现 。 如果您不想重复代码,则可以使委托签名接受可选字符串,并从实际方法实现中删除可选字符串。
为了使它起作用,您还需要向您的委托声明中添加可选参数。 代表的声明应为:
delegate void Order(string abc = "Optional Param");
默认字符串可以是任何编译常数字符串值。
还应该提及的是,这样做意味着ReverseOrder方法不需要具有可选参数。 可以声明为:
public static void ReverseOrder(string rev) { ... }
委托人的签名要求设置参数。 您将需要提供字符串abc的值,并像这样调用:
changeorder.Invoke("hello world");
也将默认值添加到委托中,例如
delegate void Order(string abc = "Optional Parameter");
您需要您的委托人签名还支持可选参数,当前您的方法签名和委托人签名不相同:
delegate void Order(string abc="");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.