只能在静态方法上调用委托。我运行下面的代码并得到错误的方法名称预期在行
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
对于静态方法,委托对象封装了要进行的方法 调用。例如,方法,委托对象封装了两个 实例和实例上的方法。
感谢。
答案 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
中分配这种方法的签名。