2011-04-25 9 views
7

Mam klasę, w której użytkownik może przekazać działanie (lub nie).C#: utwórz akcję "zrób to sam" przy tworzeniu klasy

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

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


Zasadniczo, nie mogę przekazać null w mojej klasie bazowej dla Action. Ale jednocześnie nie chcę zmuszać mojego użytkownika do przejścia w Action. Zamiast tego chciałbym móc w locie tworzyć akcję "nic nie robić".

Odpowiedz

32

chcesz powiedzieć

this(t => { }) 

myśleć o tym, jak ten. Potrzebujesz t => anonymous-expression-body. W tym przypadku anonymous-expression-body to expression lub block. Nie możesz mieć pustego wyrażenia, więc nie możesz wskazać pustej treści metody z expression. Dlatego należy użyć wartości block, w którym to przypadku można powiedzieć { }, aby wskazać, że block ma pusty i dlatego jest pustym ciałem.

Aby uzyskać szczegółowe informacje, zobacz specyfikację gramatyki, Dodatek B.

A oto inny sposób, aby myśleć o tym, co jest sposobem, który można użyć, aby odkryć to dla siebie. An Action<T> to metoda, która pobiera T i zwraca void. Możesz zdefiniować Action<T> za pomocą metody nieanonimowej lub anonimowej. Próbujesz dowiedzieć się, jak to zrobić, używając anonimowej metody (lub raczej bardzo specjalnej anonimowej metody, a mianowicie wyrażenia lambda). Jeśli chcesz to zrobić za pomocą metody nieanonimowego powiedziałbyś

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

i wtedy można powiedzieć

this(MyAction) 

który wykorzystuje koncepcję grupy metody. Ale teraz chcesz przetłumaczyć to na wyrażenie lambda. Tak więc, po prostu weźmy tę treść metody i uczyńmy ją wyrażeniem lambda. Dlatego wyrzucamy private void MyAction<T>(T t) i zastępujemy go t => i kopiujemy dosłownie treść metody { }.

this(t => { }) 

Bum.

6

Czy to nie powinny być nawiasy klamrowe?

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

forma lambda jest (/*paramaters*/) => {/*body*}

nawiasów wokół parametry mogą zostać pominięte, ale Klamerki na całym ciele mogą być pominięte, jeśli tylko jest to pojedyncza (nie pusta) oświadczenie.

Powiązane problemy