2010-04-20 13 views
11

Mam funkcji zdefiniowane następująco:domyślne argumenty dotyczące budowli

public static void ShowAbout(Point location, bool stripSystemAssemblies = false, bool reflectionOnly = false)

Ten flagi CA1026 „Wymień metody«ShowAbout»z przeciążenia, który dostarcza wszystkie argumenty default”. Nie mogę wykonać Point location = new Point(0, 0) ani ponieważ nie są to stałe czasu kompilacji i dlatego nie mogą być wartościami domyślnymi dla tego argumentu funkcji. Pytanie brzmi, w jaki sposób można określić domyślne wartości argumentów dla struktur? Jeśli nie da się tego zrobić, najprawdopodobniej pójdę po tłumienie CA1026 w źródle z jakimkolwiek usprawiedliwieniem, które ktoś tu daje.

+0

Mówię, pomij zalecenie. To zdecydowanie nie jest gospel. – ChaosPandion

Odpowiedz

19

Można to zrobić:

public static void ShowAbout(Point location = new Point(), 
    bool stripSystemAssemblies = false, 
    bool reflectionOnly = false) 

od C# 4 specyfikacji, rozdział 10.6.1:

Wyrażenie w default-argumentu musi być jedną z następujących czynności:

  • a stała ekspresja
  • wyrazem postaci new S() gdzie S jest typ wartości
  • wyrazem postaci default(S) gdzie S jest typ wartości

Więc można również użyć:

public static void ShowAbout(Point location = default(Point), 
    bool stripSystemAssemblies = false, 
    bool reflectionOnly = false) 

EDIT: Jeśli chcesz ustawić domyślną wartość inną niż punkt (0, 0), warto wiedzieć o innym podstęp:

public static void ShowAbout(Point? location = null 
    bool stripSystemAssemblies = false, 
    bool reflectionOnly = false) 
{ 
    // Default to point (1, 1) instead. 
    Point realLocation = location ?? new Point(1, 1); 
    ... 
} 

Pozwoliłoby to również dzwoniącym wyraźnie powiedzieć "wybierz domyślny", przekazując wartość null.

+0

Czuję się niedorzecznie, ponieważ nie próbuję konstruktora bez parametrów. Przyjmuję tę odpowiedź za dziewięć minut. –

+1

Możesz rozważyć opcję "default (Point)". Dla mnie jest to bardziej intuicyjne. – ChaosPandion

+0

Wszystkie dobre sugestie. Oczywiście, reguła nadal oznacza dla innej wersji funkcję, która pobiera ciąg znaków "[params string]", więc myślę, że CA1026 może być zepsuty. –

1

AFAICT CA1026 oznacza, że ​​należy go zastąpić funkcjami, które w ogóle nie używają argumentów domyślnych. Więc zmiana go, tak jak pokazano, nadal powodowałaby naruszenie.

Powiązane problemy