2012-09-21 19 views

Respuesta

25

La premisa es incorrecta; funciona bien:

Func<int> func = delegate { Console.WriteLine("first part"); return 5; }; 
func += delegate { Console.WriteLine("second part"); return 7; }; 
int result = func(); 

Es un delegado de multidifusión con un resultado no nulo, funciona bien. Puede ver desde la consola que ambas partes se ejecutaron. El resultado del último artículo es el que se devuelve. Podemos demostrar que este es un verdadero delegado de multidifusión:

if(func is MulticastDelegate) Console.WriteLine("I'm multicast"); 

y escribiremos "Estoy multidifusión" incluso después de sólo la primera línea (cuando sólo hay un único método en la lista).

Si necesita más control sobre los resultados individuales, a continuación, utilizar GetInvocationList():

foreach (Func<int> part in func.GetInvocationList()) 
{ 
    int result = part(); 
} 

que le permite ver cada resultado individual.

En la terminología IL:

.class public auto ansi sealed Func<+ TResult> 
    extends System.MulticastDelegate` 

es decir: Func<T> hereda de MulticastDelegate. Básicamente, para todos los efectos, todos los delegados en .NET son delegados de multidifusión. Usted podría ser capaz de obtener un delegado no multidifusión en C++ administrado, no lo sé. Pero ciertamente no de C#.

+0

Eeeek. ¿Siempre funcionó de esa manera? Podría estar imaginando cosas ... – Jon

+0

@Jon de memoria, ese podría haber sido uno de los grandes cambios entre .NET 1.0 y .NET 1.1 –

+0

gracias Mark ... ha ayudado ... – samj28

5

La respuesta siguiente es errónea desde el punto de vista de los hechos, porque actualmente * puede * tener delegados de multidifusión con un tipo de devolución no nulo (el jurado aún no ha resuelto si siempre ha sido así). Sin embargo, sí responde a la pregunta "¿Por qué un lenguaje no permite tales delegados?", Así que lo dejo para completarlo.

Now go and upvote Marc.


Debido a que los métodos de múltiples volverían varios valores, así que lo que si el valor de un retorno del delegado entonces? Claramente, no hay respuesta que sea satisfactoria en todas las circunstancias. Se podría argumentar que el delegado de multidifusión debe:

  • retorno el valor del primer método con el fin de invocación (pero para la invocación IIRC no se especifica, así que ¿cómo funcionaría esto?)
  • devolver el valor de la última método , como se describe arriba
  • devuelve el único valor distintivo devuelto por todos los delegados; lanzar una excepción si no todos están de acuerdo
+0

Se debe tener en cuenta que * todos * los delegados en .NET son delegados de multidifusión. –

+0

@DanielHilgarth: ¿Se refiere al nombre de la clase y la funcionalidad que admite? Si es así, técnicamente está en lo cierto, pero "todos los delegados son multidifusión" deja una impresión equivocada. Obviamente, usted * puede * tener delegados con un tipo de devolución no nulo, y esto debe concillarse con su extracto. – Jon

+0

Ver respuesta por Marc. Eso es exactamente lo que quise decir. –

2

en multidifusión el problema es que anular todos los valores sólo imprimir el último valor método si tiene tipo de retorno, lo que tiene que capturar el tipo de retorno de uno a uno, le permite ver el código de abajo

class Program 
{ 
    // i am going to add and subtract two num but i wanna get result in string the same thing you can do for int and what ever you want 
     delegate string mydeledagte(int a,int b); 
     delegate string d(int s, int t); 
    static void Main(string[] args) 
    { 
     mydeledagte ab = new mydeledagte(ad); 
     mydeledagte d= new mydeledagte(sub); 
     mydeledagte multi = ab + d; 

     foreach (mydeledagte individualMI in multi.GetInvocationList()) 
     { 
      string retVal = individualMI(3, 5); 
      Console.WriteLine("Output: " + retVal); 
      Console.WriteLine("\n***developer of KUST***"); 
      Console.ReadKey(); 
     } 
    } 
    static string ad(int a, int b) 
    { 

     return (a + b).ToString(); 

    } 
    static string sub(int a, int b) 
    { 

     return (a - b).ToString(); ; 
    } 
} 
Cuestiones relacionadas