繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM