为什么这个多播委派不适用于C#中的函数



我是C#的新手,正在进行多播委派,我写了以下代码:

class MyClass
{
public static double Calculate(int x, double z)
{
double Result = (x / z);
return Result;
}
public static double Calculate2(int x, double z)
{
double Result = (x * z);
return Result;
}
}
public class Program
{
public delegate double MyDlgt(int Number1, double Number2);
public static void Main()
{
Console.WriteLine("What is You First Value ? ");
int NUM1 = int.Parse(Console.ReadLine());
Console.WriteLine("What is You Second Value ? ");
Double NUM2 = Double.Parse(Console.ReadLine());
MyDlgt FirstDlgt = new MyDlgt(MyClass.Calculate);
MyDlgt SecondDlgt = new MyDlgt(MyClass.Calculate2);
Console.WriteLine("<---------Simple Delegate --------->");
Console.WriteLine("The Division Result is : " + FirstDlgt(NUM1, NUM2));
Console.WriteLine("The Multiply Result is : " + SecondDlgt(NUM1, NUM2));
Console.WriteLine("");
Console.WriteLine("<---------MultiCast Delegate --------->");
MyDlgt MultiCast = FirstDlgt + SecondDlgt;
Console.WriteLine("The Result is : " + MultiCast(NUM1, NUM2));
Console.Read();
}
}

多播只显示了第二个功能,我不知道为什么。

结果是

What is You First Value ? 
10
What is You Second Value ? 
20
<---------Simple Delegate --------->
The Division Result is : 0.5
The Multiply Result is : 200
<---------MultiCast Delegate --------->
The Result is : 200

我尝试了使用void进行多播,并完美地工作

class MyClass
{
public static void Calculate(int x, double z)
{
Console.WriteLine("The Result is :"+ (x / z));
}
public static void Calculate2(int x, double z)
{
Console.WriteLine("The Result is :" + (x * z));
}
public static void Main()
{
Console.WriteLine("What is You First Value ? ");
int NUM1 = int.Parse(Console.ReadLine());
Console.WriteLine("What is You Second Value ? ");
Double NUM2 = Double.Parse(Console.ReadLine());
MyDlgt FirstDlgt = new MyDlgt(MyClass.Calculate);
MyDlgt SecondDlgt = new MyDlgt(MyClass.Calculate2);

Console.WriteLine("<---------Simple Delegate --------->");

FirstDlgt.Invoke(NUM1, NUM2);
SecondDlgt.Invoke(NUM1, NUM2);

Console.WriteLine("");
Console.WriteLine("<---------MultiCast Delegate --------->");
MyDlgt MultiCast = FirstDlgt + SecondDlgt;

MultiCast(NUM1, NUM2);
Console.ReadLine();
}
}
}

结果是正确的:

What is You First Value ? 
10
What is You Second Value ? 
20
<---------Simple Delegate --------->
The Result is :0.5
The Result is :200
<---------MultiCast Delegate --------->
The Result is :0.5
The Result is :200

为什么它使用void而不使用带有return的函数?

抱歉发了这么长的帖子,提前感谢

根据规范:

如果委托调用包括输出参数或返回值,则其最终值将来自对列表中最后一个委托的调用。

如果您需要对单个结果进行更多控制,请使用GetInvocationList():

foreach (MyDlgt myDlgt in MultiCast.GetInvocationList())
{
double result = myDlgt(NUM1, NUM2);
}

最新更新