2013-06-27 15 views
11

Ist es möglich, eine Aktion als optionalen Parameter in einer Funktion zu haben? Die button2Action sollte optional sein.Aktion als optionaler Parameter in einer Funktion

public void DrawWindow(Rect p_PositionAndSize, string p_Button2Text = "NotInUse", Action p_Button2Action) 
{ 
// Stuff happens here 
} 

Ich versuchte es mit z p_Button2Action = delegate{ Debug.Log("NotInUse"); } aber aufgrund Standardwert Parameter nicht kompiliert für p_Button2Action ein Kompilierung-Konstante sein muss. Wie machst du eine optionale Aktion, die eine Kompilierzeitkonstante ist?

Antwort

13

Sie müssen einen konstanten Wert für einen Standardparameter angeben, sodass der einzige Standardwert, den Sie für eine Aktion angeben können, null ist.

Allerdings ist es einfach für null zu prüfen und den korrekten Wert ersetzen:

public void DrawWindow(Rect p_PositionAndSize, string p_Button2Text = "NotInUse", Action p_Button2Action = null) 
{ 
    if (p_Button2Action == null) 
     p_Button2Action = delegate{ Debug.Log("NotInUse"); } 

    ... 
} 
+1

Wenn Sie null als Standardaktion verwenden möchten, können Sie Folgendes verwenden: p_Button2Action? .Invoke(); – RMazitov

+0

@RMazitov Beachten Sie, dass der Koaleszenzoperator null nur in C# 6 oder höher verfügbar ist - also ist es richtig, das jetzt zu verwenden (aber offensichtlich gab es das 2013 nicht) –

+0

ja, guter Punkt. Danke, dass du das gemacht hast) – RMazitov

0

Versuchen Sie folgendes:

public void DrawWindow(Rect p_PositionAndSize, string p_Button2Text = "NotInUse", Action p_Button2Action = null) 
{ 
// Stuff happens here 
} 
+0

Aber OP will es eine Standardaktion wie Delegierten hat {debug.log („NotInUse“); } und nicht null – nemesv

+0

Dann denke ich, du solltest mit dem Vorschlag von Mario gehen. Gemäß der Sprachspezifikation können Sie den Standardwert mit Ausnahme von Null nicht für Referenztypen verwenden. Nur Strings dürfen Werte in Standardparametern haben. – vendettamit

3

Eine Abhilfe für dieses sein kann, nur klassische Überlastung zu verwenden:

public void DrawWindow(Rect p_PositionAndSize, string p_Button2Text = "NotInUse") 
{ 
    DrawWindow(p_PositionAndSize, delegate{ Thread.Sleep(1); }, p_Button2Text); 
} 

public void DrawWindow(Rect p_PositionAndSize, Action p_Button2Action, string p_Button2Text = "NotInUse") 
{ 
// Stuff happens here 
} 

diese Weise können Sie die Standardaktion in der Überlastung mit zwei Parametern angeben.

Verwandte Themen