2013-06-27 20 views
11

Czy możliwe jest posiadanie akcji jako opcjonalnego parametru w funkcji? Przycisk2Akcja powinna być opcjonalna.Akcja jako parametr opcjonalny w funkcji

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

Próbowałem go np p_Button2Action = delegate{ Debug.Log("NotInUse"); } ale nie skompilować powodu Domyślna wartość parametru dla p_Button2Action musi być stałą czasu kompilacji. W jaki sposób można wykonać opcjonalną akcję, która jest stałą czasu kompilacji?

Odpowiedz

13

Należy podać stałą wartość domyślnego parametru, więc jedyną domyślną wartością dla akcji jest wartość null.

Jednak jest to łatwe do sprawdzenia nieważną i zastąpić poprawną wartość:

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

jeśli chcesz null jako domyślną akcję, której możesz użyć: p_Button2Akcja? .Invoke(); – RMazitov

+0

@Razitov Zwróć uwagę, że operator koalescencji zerowej jest dostępny tylko w języku C# 6 lub nowszym - więc jest właściwe używać go teraz (ale oczywiście nie istniało w 2013 roku) –

+0

tak, dobra uwaga. dzięki za wniesienie tego) – RMazitov

0

Spróbuj tego:

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

Ale PO chce mieć domyślną akcję tam jak delegat {debug.log („NotInUse”); } i nieważne – nemesv

+0

Myślę, że powinieneś pójść z sugestią Mario. Zgodnie ze specyfikacją językową nie można używać wartości domyślnej oprócz typów zerowych do referencyjnych. tylko łańcuchy mogą mieć wartości w domyślnych parametrach. – vendettamit

3

Jeden obejście może to być po prostu użyć klasycznego przeciążeniu:

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 
} 

W ten sposób można określić domyślny działania w przeciążeniu z dwoma parametrami.

Powiązane problemy