2010-08-06 29 views
12

estoy empezando a tomar ventaja de parámetros opcionales en .Net 4.0Usando un parámetro opcional de tipo System.Drawing.Color

El problema que estoy teniendo es cuando intento para declarar un parámetro opcional de System.Drawing. Color:

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

Quiero Color.Transparent para ser el valor predeterminado para el parámetro rgb. El problema es, me siguen dando este error de compilación:

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

Realmente mata mi plan si sólo puedo utilizar tipos primitivos de parametros opcionales.

+0

posible duplicado de [C# 4.0:? ¿Puedo utilizar un intervalo de tiempo como un parámetro opcional con un valor predeterminado] (http://stackoverflow.com/questions/2168798/c-sharp-4- 0-can-i-uso-a-lapso de tiempo-como-un-opcional-parámetro-con-un-default-valor) – nawfal

Respuesta

20

tipos de valor anulables se pueden utilizar para ayudar en situaciones como esta.

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

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

Por cierto, la razón de esto es necesario se debe a que el valor por defecto se rellena en el punto de llamada durante la compilación y static readonly valores no se establece hasta que el tiempo de ejecución. (Por el tipo inicializador)

+0

Lo hice sin Visual Studio, por lo que puede necesitar algunos ajustes menores. –

+0

Esto no funcionará, el color no se puede anular. –

+0

@Neil N, el signo de interrogación después de que el nombre del tipo 'Color' hace que la estructura de un' ' anulables. –

3

No soy un gran admirador de los parámetros opcionales para casos como este en absoluto. IMO el mejor caso de uso para parámetros opcionales es la interoperabilidad con COM, donde los parámetros opcionales se usan bastante. Situaciones como estas son una de las razones por las cuales (supongo) que los parámetros opcionales no llegaron al idioma hasta 4.0.

En lugar de crear un parámetro opcional, la sobrecarga de la función de este modo:

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

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

eso es en realidad lo que tenía antes, pero en mi caso, porque hay tantas sobrecargas del constructor , tiene más sentido tener un puñado de params opcionales y mantener un constructor. –

+0

yo diría que no lo hace, y un buen contraejemplo es el problema que se está ejecutando en este momento. Hay un buen número de funciones en todas las bibliotecas .NET estándar que tienen * bastante * una cantidad de sobrecargas. Tome Convert.ToInt32() por ejemplo ... La definición de varias sobrecargas también le da la capacidad de documentar su uso por separado. A menudo, ciertas combinaciones de parámetros opcionales tienen sentido, mientras que otros no. Los parámetros opcionales no le dan la capacidad de transmitir esto utilizando solo la firma de la función en sí, mientras que una sobrecarga (hasta cierto punto) sí lo hace. –

+0

Aparte del parámetro de color, lo que yo podría reemplazar con un int, parámetros opcionales me han permitido eliminar alrededor de 100 líneas de código redundante. Hay mucho menos para mantener ahora. –

Cuestiones relacionadas