Soy un novato en C# y ejerzo la delegación de multidifusión, escribí este código:
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(); } }La multidifusión solo muestra la segunda función, no sé por qué.
El resultado es
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 : 200Intenté multicast con void y funcionó perfectamente.
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(); } } }El resultado es correcto:
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¿Por qué funciona con vacío y no con funciones con retorno?
Perdón por la extensión del post, gracias de antemano
Según la especificación :
Si la invocación del delegado incluye parámetros de salida o un valor devuelto, su valor final provendrá de la invocación del último delegado de la lista.
Si necesita más control sobre los resultados individuales, use GetInvocationList() :
foreach (MyDlgt myDlgt in MultiCast.GetInvocationList()) { double result = myDlgt(NUM1, NUM2); }