2012-12-10 5 views
12

Ich möchte in der Lage sein, Folgendes zu tun:Weisen Sie Func <> ohne diese Parameter eine Methode mit Standardwerten zu?

Func<int,bool> tryMethodFunc = TryMethod; 

Wo TryMethod wie eine Signatur hat:

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

ich die Methode Aufbrechen in ein curried Format nicht entgegengesetzt, sondern dass wäre mehr Arbeit, wenn es einen Weg gibt, dies ohne zu tun.

+5

Nur so verstehe ich, mit 'Func tryMethodFunc => (Wert) => TryMethod (Wert)' ist nicht ausreichend? –

+1

Hmmm, das funktioniert. Raten Sie, ich bin nur neu zu funktionalen Ansätze das als Antwort und ich werde es markieren. – Firestrand

+1

Fühlen Sie sich frei, KeYans Antwort zu markieren; Es ist ziemlich umfassend und enthält meine Problemumgehung. –

Antwort

8

Optionale Parameter ist eine Sprachfunktion, der Compiler ist für das Übersetzen der Aufrufe von Methoden mit optionalen Parametern zum vollständigen Aufruf mit Werten verantwortlich.

Blick auf diese einfache Stück Code unten,

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

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

Wenn Sie diese Methoden zu zerlegen, werden Sie sehen, dass der C# -Compiler den Anruf tatsächlich zu Testmethod mit einem Parameter auf einen Anruf mit den beiden Parametern ersetzt. Der Screenshot von ildasm beweist, dass

ildasm screen shot

Nun, um aktuelles Problem kommt, wird die Codezeile in Frage eine Func mit einem Verfahren zu binden versuchen, die optionalen Parameter hat. Wenn der C# -Compiler damit umgehen muss, muss er sicherstellen, dass der Func einige die Standardwerte kennt. Während dies durch Compiler hätte erreicht werden können, vereitelt es vollständig den Zweck von Func.

Zweck von Func bietet eine Möglichkeit, anonyme Methoden in einer verallgemeinerten und einfachen Weise zu speichern. "reference

Eine weitere ähnliche Frage in Stackoverflow kann einen Parameter und ruft die TryMethod aus dem Körper dieser anonymen Methode gefunden werden here

@ Chris Sinclair-Lösung, indem eine anonyme Methode, um dies funktioniert, die.

Verwandte Themen