Argomenti predefiniti per le strutture

Ho una funzione definita in questo modo:

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

Questo contrassegna il CA1026 “Sostituisci il metodo ‘ShowAbout’ con un overload che fornisce tutti gli argomenti predefiniti”. Non posso fare Point location = new Point(0, 0) o Point location = Point.Empty perché non sono costanti di tempo di compilazione e quindi non possono essere i valori di default per quell’argomento di funzione. Quindi la domanda è: come si fa a specificare i valori degli argomenti predefiniti per le strutture? Se non può essere fatto, probabilmente andrò a sopprimere CA1026 in fonte con qualsiasi giustificazione che qualcuno qui dà.

Puoi farlo:

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

Dalla specifica C # 4, sezione 10.6.1:

L’espressione in un argomento predefinito deve essere una delle seguenti:

  • un’espressione costante
  • un’espressione della new S() forma new S() dove S è un tipo di valore
  • un’espressione di default(S) del modulo default(S) cui S è un tipo di valore

Quindi potresti anche usare:

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

EDIT: se si desidera impostare un valore diverso da un punto (0, 0), vale la pena conoscere un altro trucco:

 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); ... } 

Ciò consentirebbe anche ai chiamanti di dire esplicitamente “scegli l’impostazione predefinita” passando in null.

AFAICT CA1026 significa che è necessario sostituirlo con funzioni che non utilizzano affatto argomenti predefiniti. Quindi cambiarlo come mostrato avrebbe comunque sollevato la violazione.