C #: crea un’azione nulla da fare sull’istanza della class

Ho una class in cui l’utente può passare un’azione (o meno).

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

Fondamentalmente, non posso passare nulla nella mia class base per l’ Action . Ma, allo stesso tempo, non voglio costringere il mio utente a passare Action . Invece, voglio essere in grado di creare un’azione “do-nothing” al volo.

Vuoi dire

 this(t => { }) 

Pensa in questo modo. Hai bisogno di t => anonymous-expression-body . In questo caso, anonymous-expression-body è expression o un block . Non è ansible avere un’espressione vuota, quindi non è ansible indicare un corpo del metodo vuoto con expression . Pertanto, devi usare un block nel qual caso puoi dire { } per indicare che un block ha un statement-list vuoto ed è quindi il corpo vuoto.

Per i dettagli, consultare le specifiche grammaticali, appendice B.

Ed ecco un altro modo di pensarci, che è un modo che puoi usare per scoprirlo da solo. Un’azione Action è un metodo che accetta una T e restituisce void . È ansible definire Action tramite un metodo non anonimo o tramite un metodo anonimo. Stai cercando di capire come farlo usando un metodo anonimo (o meglio, un metodo anonimo molto speciale, ovvero un’espressione lambda). Se volessi farlo tramite un metodo non anonimo, diresti

 private void MyAction(T t) { } 

e quindi potresti dire

 this(MyAction) 

che usa il concetto di un gruppo di metodi. Ma ora vuoi tradurre questo in un’espressione lambda. Quindi, prendiamo il corpo del metodo e ne facciamo un’espressione lambda. Pertanto, gettiamo via il private void MyAction(T t) e lo sostituiamo con t => e copia verbatim il metodo body { } .

 this(t => { }) 

Boom.

Non dovrebbe essere parentesi graffe?

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

Il form Lambda è (/*paramaters*/) => {/*body*}

È ansible omettere le parentesi attorno ai parametri, ma le parentesi graffe attorno al corpo possono essere omesse solo se si tratta di una singola affermazione (non vuota).