【问题标题】:Calling a method with optional parameter by delegate’s instance通过委托的实例调用带有可选参数的方法
【发布时间】:2016-08-19 11:21:23
【问题描述】:

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

我想通过调用委托的实例来调用一个方法(它有一个可选参数)。

我的代码在下面

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”相对应的参数

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    要使其正常工作,您还需要将可选参数添加到您的委托声明中。代表的声明应该是:

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

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

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

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

    【讨论】:

      【解决方案3】:

      委托的签名需要设置一个参数。您将需要提供字符串 abc 的值并像这样调用:

      changeorder.Invoke("hello world");
      

      【讨论】:

        【解决方案4】:

        也为委托添加默认值,比如

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

        【讨论】:

          【解决方案5】:

          您需要委托签名也支持可选参数,目前您的方法签名和委托签名不一样:

          delegate void Order(string abc="");
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-13
            • 2019-12-20
            相关资源
            最近更新 更多