2010-08-06 17 views
12

zaczynam skorzystać z opcjonalnych parametrów w .NET 4.0Za pomocą opcjonalnego parametru typu System.Drawing.Color

Problem mam jest, gdy próbuję zadeklarować opcjonalny parametr System.Drawing. Kolor:

public myObject(int foo, string bar, Color rgb = Color.Transparent) 
{ 
    // .... 
} 

Chcę, aby Color.Transparent był domyślną wartością dla parametru rgb. Problem polega na tym, że ciągle otrzymuję ten błąd kompilacji:

Default parameter value for 'rgb' must be a compile-time constant

To naprawdę zabija mój plan, jeśli mogę używać tylko typów pierwotnych dla opcjonalnych parametrów.

+0

możliwy duplikat [C# 4.0: Czy mogę używać TimeSpan jako opcjonalnego parametru z wartością domyślną?] (Http://stackoverflow.com/questions/2168798/c- sharp- 0-can-i-use-a-timespan-as-a-opcjonalny-parametr-z-wartością-domyślną) – nawfal

Odpowiedz

20

typy wartości dopuszczające wartość null mogą być wykorzystane, aby pomóc w takich sytuacjach.

public class MyObject 
{ 
    public Color Rgb { get; private set; } 

    public MyObject(int foo, string bar, Color? rgb = null) 
    { 
     this.Rgb = rgb ?? Color.Transparent; 
     // .... 
    } 
} 

BTW, powodem jest to wymagane jest, ponieważ domyślna wartość jest wypełniana w momencie wywołania podczas kompilacji i static readonly wartości nie są aż starcie. (Przez inicjator typu)

+0

Zrobiłem to bez Visual Studio, więc może potrzebować drobnych poprawek. –

+0

Ths przyzwyczajenie się, kolor nie jest null. –

+0

@Neil N, znak zapytania po nazwie typu "Kolor" sprawia, że ​​struktura ta jest "Nullable ". –

3

Nie jestem wielkim fanem opcjonalnych parametrów dla takich przypadków w ogóle. IMO najlepszym przypadkiem użycia dla opcjonalnych parametrów jest współdziałanie z COM, gdzie opcjonalne parametry są używane całkiem sporo. Takie sytuacje są jednym z powodów (jak sądzę), że opcjonalne parametry nie dotarły do ​​języka do 4.0.

Zamiast tworzyć opcjonalny parametr, przeciążyć funkcję tak:

public myObject(int foo, string bar) : this (foo, bar, Color.Transparent) {}; 

public myObject(int foo, string bar, Color RGB) { 
... 
} 
+0

to właściwie to, co miałem wcześniej, ale w moim przypadku, ponieważ jest tak wiele przeciążeń konstruktora , bardziej sensowne jest posiadanie garstki opcjonalnych parametrów i zachowanie jednego konstruktora. –

+0

Twierdzę, że tak nie jest, a dobry kontrprzykład to problem, na który natrafiasz. Istnieje wiele różnych funkcji w standardowych bibliotekach .NET, które mają * dość * pewną liczbę przeciążeń. Take Convert.ToInt32() na przykład ... Definiowanie wielu przeciążeń daje także możliwość udokumentowania ich użycia osobno. Często pewne kombinacje parametrów opcjonalnych mają sens, a inne nie. Parametry opcjonalne nie dają możliwości przekazania tego przy użyciu samego podpisu funkcji, podczas gdy przeciążenie (w pewnym stopniu) ma miejsce. –

+0

Oprócz parametru Kolor, który mógłbym zastąpić int, opcjonalne parametry pozwoliły mi usunąć około 100 linii kodu nadmiarowego. Teraz jest znacznie mniej do utrzymania. –

Powiązane problemy