2011-01-26 13 views
17

pierwszy raz pytanie dla mnie :)Wartość domyślna na generycznego predykatu jako argument

Potrzebuję jakiś sposób, aby określić domyślny orzecznik użycie ogólnego formatu

Func<T, bool> 

a następnie użyć tego jako domyślny argument. Coś takiego:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = (T t) => true) 

Kiedy to zrobić pojawia się błąd kompilacji:

Domyślna wartość parametru dla „orzecznik” musi być kompilacji stałą

Czy istnieje gładki sposób prowadzenia to, czego mi brakuje, czy też powinienem uczynić funkcję orzecznika zerowalną i odpowiednio zmienić logikę funkcji?

Dzięki,

Odpowiedz

21

wartości domyślne dla parametrów metody muszą być stałe w czasie kompilacji, jako wartości domyślne są faktycznie kopiowane do wszystkich miejsc połączeń metody przez kompilator.

Musisz użyć przeciążenie, aby to zrobić:

public bool Broadcast(byte command, MemoryStream data, bool async) { 
    return Broadcast(command, data, async, t => true); 
} 

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate) { 
    // ... 
} 

Ponadto, istnieje szczególne Predicate<T> delegat w mscorlib których można użyć zamiast. To ten sam podpis jak Func<T, bool>, ale wyraźnie zaznacza go jako delegata, który decyduje, czy dana czynność jest wykonywana na instancji T

+0

Przechodzę do tego w celu uzyskania dodatkowych informacji o predykacie Bakery

2

Złóż przeciążenie dla emisji, która nie bierze ostatni argument.

2

Spróbuj tego:

public bool Broadcast(byte command, MemoryStream data, bool async, Func<T, bool> predicate = default(Func<T, bool>)) 

Ale myślę, że trzeba sprawdzić orzecznika! = null.

+1

W tym przypadku mogę równie dobrze zrobić publiczne transmitowanie bool (polecenie bajtowe, dane MemoryStream, bool async, Func predicate = null) – Bakery

Powiązane problemy