2010-04-20 12 views
11

he definido una función como esta:argumentos predeterminados para estructuras

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

Este banderas CA1026 "Reemplazar método 'ShowAbout' con una sobrecarga que suministra todos los argumentos por defecto". No puedo hacer Point location = new Point(0, 0) o Point location = Point.Empty porque tampoco son constantes de tiempo de compilación y, por lo tanto, no pueden ser los valores predeterminados para ese argumento de función. Entonces, la pregunta es, ¿cómo se puede especificar los valores predeterminados de los argumentos para las estructuras? Si no se puede hacer, es probable que vaya a suprimir CA1026 en la fuente con la justificación que alguien presente aquí.

+0

Digo suprimir la recomendación. Definitivamente no es evangelio. – ChaosPandion

Respuesta

19

Usted puede hacer esto:

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

A partir de la especificación C# 4, sección 10.6.1:

La expresión en una forma predeterminada argumento debe ser uno de los siguientes:

  • un constante-expresión
  • una expresión de la forma new S() donde S es un tipo de valor
  • una expresión de la forma default(S) donde S es un tipo de valor

Así también se puede utilizar:

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

EDITAR: Si desea establecer un valor predeterminado otro que el punto (0, 0), vale la pena saber sobre otro truco:

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

Esto también permitiría que las personas que llaman dicen explícitamente, "tienes que elegir el valor predeterminado" pasando en nulo.

+0

Me siento ridículo por no probar el constructor sin parámetros. Aceptaré esta respuesta en nueve minutos. –

+1

Es posible que desee considerar 'por defecto (Point)'. Para mí, se siente más intuitivo. – ChaosPandion

+0

Todas buenas sugerencias. Por supuesto, la regla todavía indica una versión diferente de la función que toma una cadena 'params []', así que creo que CA1026 podría estar roto. –

1

AFAICT CA1026 significa que debe reemplazarlo por funciones que no usan argumentos predeterminados. Así que cambiarlo como se muestra aún levantaría la violación.

Cuestiones relacionadas