2010-04-21 17 views
6

C# 4.0 wprowadza opcjonalne parametry, na które czekam od dłuższego czasu. Jednak wydaje się, że ponieważ tylko typy systemowe mogą być const, nie mogę użyć żadnej klasy/struktury, które utworzyłem jako opcjonalny parametr.Opcjonalne parametry typu niesystemowego

Czy jest jakiś sposób, który pozwala mi użyć bardziej złożonego typu jako parametru opcjonalnego. Czy jest to jedna z rzeczywistości, z którymi po prostu trzeba żyć?

+0

Nie ma ograniczeń co do " Rodzaje systemów ". Co prowadzi do tego, że w to wierzysz? –

+0

mogą to być inne typy, ale jedyną dostępną wartością domyślną jest null (lub prawdopodobnie coś, z czym typ może domyślnie przekonwertować, ale nie mogę tego przetestować, ponieważ nie mam 4.0 w pracy)) –

Odpowiedz

10

Najlepszym mogę wymyślić dla typów referencyjnych było:

using System; 

public class Gizmo 
{ 
    public int Foo { set; get; } 
    public double Bar { set; get; } 

    public Gizmo(int f, double b) 
    { 
     Foo = f; 
     Bar = b; 
    } 
} 

class Demo 
{ 
    static void ShowGizmo(Gizmo g = null) 
    { 
     Gizmo gg = g ?? new Gizmo(12, 34.56); 
     Console.WriteLine("Gizmo: Foo = {0}; Bar = {1}", gg.Foo, gg.Bar); 
    } 

    public static void Main() 
    { 
     ShowGizmo(); 
     ShowGizmo(new Gizmo(7, 8.90)); 
    } 
} 

można wykorzystywać ten sam pomysł na elemencie uzależniając pustych parametrów:

public struct Whatsit 
{ 
    public int Foo { set; get; } 
    public double Bar { set; get; } 

    public Whatsit(int f, double b) : this() 
    { 
     Foo = f; Bar = b; 
    } 
} 

static void ShowWhatsit(Whatsit? s = null) 
{ 
    Whatsit ss = s ?? new Whatsit(1, 2.3); 
    Console.WriteLine("Whatsit: Foo = {0}; Bar = {1}", 
     ss.Foo, ss.Bar); 
} 
+0

Myślałem o tym, ale ponieważ używałam struktury, to też się to nie podobało. Nie wiem, dlaczego nie tylko sprawiłem, że func przyjmie wersję zerową (Size? Size = null). –

+0

System.Nullable ... Teraz pamiętam skąd wziąłem pomysł na dodatkowe "zainicjalizowane" pole w strukturze. :) –

+1

FYI, nadal możesz używać? operator o strukturze nullable. –

6

Można użyć dowolnego typu jako opcjonalny parametr:

using System; 

class Bar { } 

class Program 
{ 
    static void Main() 
    { 
     foo(); 
    } 
    static void foo(Bar bar = null) { } 
} 

Dobra, ja ponownie przeczytać pytanie i myślę, co masz na myśli - chcesz być w stanie zrobić coś takiego:

static void foo(Bar bar = new Bar()) { } 

Niestety jest to niedozwolone, ponieważ wartość domyślnego parametru musi być znana podczas kompilacji, aby kompilator mógł go upiec w zespole.

+0

"upiecz go do montaż "- Ludzie nie zauważają, że zmiana domyślnej wartości parametru w bibliotece nie zmieni go w kodzie klienta, który nie został ponownie skompilowany. –

Powiązane problemy