2011-04-25 10 views
7

Tengo una clase en la que el usuario puede pasar una Acción (o no).C#: crear una acción de no hacer nada en la creación de instancias de clase

public class FooClass<T> : BaseClass<T> 
{ 
    public FooClass() 
     : this((o) =>()) //This doesn't work... 
    { 
    } 

    public FooClass(Action<T> myAction) 
     : base(myAction) 
    { 
    } 
} 


Básicamente, no puedo pasar null en mi clase base para la Action. Pero, al mismo tiempo, no quiero obligar a mi usuario a pasar un Action. En cambio, quiero ser capaz de crear una acción de "no hacer nada" sobre la marcha.

Respuesta

32

que quiere decir

this(t => { }) 

Piense en ello como esto. Necesita t => anonymous-expression-body. En este caso, anonymous-expression-body es expression o block. No puede tener una expresión vacía por lo que no puede indicar un cuerpo de método vacío con un expression. Por lo tanto, debe usar un block en cuyo caso puede decir { } para indicar que a block tiene un statement-list vacío y, por lo tanto, es el cuerpo vacío.

Para más detalles, ver la especificación de la gramática, el apéndice B.

Y aquí es otra manera de pensar en ella, que es una forma que se puede utilizar para descubrir esto por sí mismo. Un Action<T> es un método que admite T y devuelve void. Puede definir un Action<T> a través de un método no anónimo o mediante un método anónimo. Está tratando de descubrir cómo hacerlo usando un método anónimo (o más bien, un método anónimo muy especial, a saber, una expresión lambda). Si quería hacer esto a través de un método no anónimo que diría

private void MyAction<T>(T t) { } 

y luego se podría decir

this(MyAction) 

que utiliza el concepto de un grupo método. Pero ahora quieres traducir esto a una expresión lambda. Entonces, tomemos ese cuerpo de método y hagamos que sea una expresión lambda. Por lo tanto, tiramos el private void MyAction<T>(T t) y lo reemplazamos por t => y copiamos literalmente el cuerpo del método { }.

this(t => { }) 

Boom.

6

¿No deberían ser llaves?

public FooClass() 
     : this(o => {}) 
    { 
    } 

forma Lambda es (/*paramaters*/) => {/*body*}

paréntesis alrededor de los parámetros se puede omitir, pero Las llaves de todo el cuerpo puede ser omitida si se trata de un solo estado (no vacío).

Cuestiones relacionadas