通过委托的实例调用带有可选参数的方法

时间:2016-08-19 11:21:23

标签: c# delegates instance-variables optional-parameters

我们知道我们可以通过使用委托引用方法,并可以通过调用委托实例来调用方法。

我想通过调用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'

5 个答案:

答案 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="");