2011-06-29 30 views
5

Acabo de ver un brand-new video en el marco de Rx, y una firma en particular me llamó la atención:¿Qué significa la Acción <Action>?

Scheduler.schedule(this IScheduler, Action<Action>) 

a las 23:55, Bart de Smet dice:

La primera versión sería Acción de la acción.

Si Action es un tipo parametrizado, ¿cómo puede aparecer unparameterized interior de los corchetes de nuevo? ¿No debería ser Action<Action<Action<...>>> ad infinitum, lo cual es obviamente imposible?

+10

¿No hay un no genérico 'action tipo así? Eso lo explicaría :) – jalf

+3

aww, ahora me siento estúpido No respondí – jalf

+3

Si realmente quieres un tipo que cuece tus fideos, juega con "delegate D D (D d);" por un momento y ve lo que puedes hacer. –

Respuesta

3

Action tiene varias sobrecargas. Uno no es genérico, los demás toman parámetros de tipo uno, dos, tres, etc. Supongamos que tienen diferentes nombres, la versión de un argumento se llama Action1, y el argumento cero (no genérico) se llama Action0, entonces el ejemplo sería Action1<Action0>.

+0

@pst Por favor, tenga más cuidado en el futuro cuando edite las respuestas de otras personas. Borró la mitad de mi texto. –

+0

No lo hice. Si se eliminó el texto, fue una falla de concurrencia por SO (es concurrencia optimista trabajando/empleado ?). Pido disculpas por las molestias. –

+0

SO es optimista sobre el cuidado que toman sus usuarios. Aparentemente demasiado optimista. –

-1

El parámetro predeterminado parece ser la solución fácil aquí.

+0

¿Parámetro predeterminado de qué ...? :( –

1

De MSDN:

ejemplo Acción

Action showMethod =() => { Console.WriteLine("Line"); }; 

showMethod(); 

Acción < T> exa MPLE

Action<int> showMethod = (i) => { Console.WriteLine("Line {0}", i); }; 

showMethod(1); 
0

Acción tiene una versión no genérica con la firma:

public delegate void Action(); 

Por lo tanto, es una acción que toma una acción de tipo void. Parece gracioso, pero es perfectamente válido.

+0

Es una acción que toma un parámetro de tipo acción, no una acción que devuelve una acción. Un ejemplo sería: Acción doSomething = (someMethod) => someMethod(); – bdowden

+0

dbowden, en realidad su ejemplo sería una Acción en lugar de la Acción no genérica. Para convertir su ejemplo en la versión no genérica, cámbielo a Acción doSomething =() => someMethod(); –

+0

@bdowden, tienes razón, tengo mis palabras mezcladas. Edité la publicación, gracias. – jscharf