委托可以调用实例方法吗?

时间:2017-09-16 06:28:13

标签: c# .net delegates

只能在静态方法上调用委托。我运行下面的代码并得到错误的方法名称预期在行

  

NuOp nuopAdd = new NuOp(x.Addition(324324,4324324));

     

NuOp nuopMultiply = new NuOp(x.Multiplication(4324,24234));

namespace DelegateEtAl
{
    public delegate double NuOp(double a, double b);

    class Program
    {
        static void Main(string[] args)
        {
            Mop x = new Mop();
            NuOp nuopAdd = new NuOp   (x.Addition(324324, 4324324));
            NuOp nuopMultiply = new NuOp(x.Multiplication(4324, 24234));

            Console.Out.WriteLine(nuopAdd);
            Console.Out.WriteLine(nuopMultiply);
        }
    }

    public class Mop
    {
        public double Addition(double opA, double opB)
        {
            return opA + opB;
        }

        public double Multiplication(double opA, double opB)
        {
            return opA + opB;
        }
    }
}

当谷歌搜索我发现的所有例子时,只处理静态方法。但以下链接说明

https://msdn.microsoft.com/en-us/library/aa288459(v=vs.71).aspx

  

对于静态方法,委托对象封装了要进行的方法   调用。例如,方法,委托对象封装了两个   实例和实例上的方法。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用静态或非静态方法调用委托。没有任何这样的限制。但是,您必须按照以下方式执行此操作:

NuOp nuopAdd = x.Addition;
NuOp nuopMultiply = x.Multiplication;

Console.Out.WriteLine(nuopAdd(324324, 4324324));
Console.Out.WriteLine(nuopMultiply(4324, 24234));

您使用代理方式的问题在于您没有正确初始化它们。如果您阅读代理人here的定义:

,这一点很清楚
  

委托是一种类型,用于表示对方法的引用   特定参数列表和返回类型。当你实例化一个   委托,您可以将其实例与任何方法关联   兼容的签名和返回类型。你可以调用(或调用)   通过委托实例的方法。

有关我们如何使用代理人的更多信息,请查看here

简而言之,委托NuOp可以指向任何方法,它接受double类型的两个参数并返回double。为了实例化你委托NuOp,你只需在上面的NuOp中分配这种方法的签名。