2012-12-10 14 views
12

Chciałbym być w stanie wykonać następujące czynności:Przypisać metodę z wartościami domyślnymi do Func <> bez tych parametrów?

Func<int,bool> tryMethodFunc = TryMethod; 

Gdzie TryMethod ma podpis takich jak:

bool TryMethod(int value, int value2 = 0, double value3 = 100.0) 

ja nie przeciwieństwie do metody rozbijania się w curry formacie jednak, że byłoby więcej pracy, gdyby można to było zrobić bez tego.

+5

Tak rozumiem, mając 'Func tryMethodFunc => (value) => TryMethod (wartość)' nie jest wystarczająca? –

+1

Hmmm, to działa. Domyślam się, że jestem nowy w podejściu funkcjonalnym. to jako odpowiedź, a ja ją oznaczyę: – Firestrand

+1

Możesz zaznaczyć odpowiedź KeYana; jest dość obszerny i zawiera moje obejście. –

Odpowiedz

8

Parametry opcjonalne to funkcja językowa, kompilator odpowiada za tłumaczenie wywołań metod z parametrami opcjonalnymi do pełnego wywoływania z wartościami.

Spójrz na ten prosty kawałek kodu poniżej,

public void GeneralMethod() 
    { 
     TestMethod(6); 
    } 

    public bool TestMethod(int a, int b = 8) 
    { 
     return true; 
    } 

Kiedy demontować tych metod, można zauważyć, że kompilator C# faktycznie otrzymuje wezwanie do TestMethod z jednego parametru do rozmowy z obu parametrów. Zrzut ekranu z ildasm dowodzi, że

ildasm screen shot

Teraz Jadąc do aktualnego problemu, wiersz kodu w pytaniu próbuje powiązać Func z metodą, która ma parametry opcjonalne. Jeśli kompilator C# musi sobie z tym poradzić, musi upewnić się, że Func zna wartości domyślne. Chociaż mogło to zostać osiągnięte przez kompilator, całkowicie zniszczyło to cel Func.

Celem Func jest zapewnienie sposobu na przechowywanie metod anonimowych w sposób uogólniony i prosty. "reference

Innym podobne pytanie na stackoverflow można znaleźć here

rozwiązanie @Chris Sinclaira działa obejść tworząc anonimową metodę, która przyjmuje jeden parametr i wywołuje TryMethod z ciała tej anonimowej metody.

Powiązane problemy