2010-04-21 27 views
6

C# 4.0 trae parámetros opcionales, que he estado esperando bastante tiempo. Sin embargo, parece que debido a que solo los tipos de sistema pueden ser const, no puedo usar ninguna clase/estructura que haya creado como un parámetro opcional.Parámetros opcionales que no son del sistema

¿Hay algún modo que me permita utilizar un tipo más complejo como parámetro opcional? ¿O es esta una de las realidades con las que uno debe vivir?

+0

No hay restricción en cuanto al " Tipos de sistema ". ¿Qué te lleva a creer eso? –

+0

pueden ser de otros tipos, pero el único valor predeterminado disponible es nulo (o posiblemente algo que el tipo puede convertir implícitamente pero no puedo probar esto ya que no tengo 4.0 en el trabajo)) –

Respuesta

10

Lo mejor que podía llegar a de los tipos de referencia fue:

using System; 

public class Gizmo 
{ 
    public int Foo { set; get; } 
    public double Bar { set; get; } 

    public Gizmo(int f, double b) 
    { 
     Foo = f; 
     Bar = b; 
    } 
} 

class Demo 
{ 
    static void ShowGizmo(Gizmo g = null) 
    { 
     Gizmo gg = g ?? new Gizmo(12, 34.56); 
     Console.WriteLine("Gizmo: Foo = {0}; Bar = {1}", gg.Foo, gg.Bar); 
    } 

    public static void Main() 
    { 
     ShowGizmo(); 
     ShowGizmo(new Gizmo(7, 8.90)); 
    } 
} 

Puede utilizar la misma idea de estructuras, haciendo que el parámetro anulable:

public struct Whatsit 
{ 
    public int Foo { set; get; } 
    public double Bar { set; get; } 

    public Whatsit(int f, double b) : this() 
    { 
     Foo = f; Bar = b; 
    } 
} 

static void ShowWhatsit(Whatsit? s = null) 
{ 
    Whatsit ss = s ?? new Whatsit(1, 2.3); 
    Console.WriteLine("Whatsit: Foo = {0}; Bar = {1}", 
     ss.Foo, ss.Bar); 
} 
+0

Estaba pensando en eso, pero como estaba usando una estructura, tampoco me gustó. No sé por qué no solo hice que el func tomara una versión que permitiera el nulo (Size? Size = null). –

+0

System.Nullable ... Ahora recuerdo de dónde saqué la idea de un campo extra "inicializado" en la estructura. :) –

+1

FYI, todavía puede usar el ?? operador con una estructura nullable. –

6

Se puede utilizar cualquier tipo como un parámetro opcional:

using System; 

class Bar { } 

class Program 
{ 
    static void Main() 
    { 
     foo(); 
    } 
    static void foo(Bar bar = null) { } 
} 

bien, vuelvo a leer su pregunta y creo que lo que quiere decir - que desea ser capaz de hacer algo como esto:

static void foo(Bar bar = new Bar()) { } 

Desafortunadamente, esto no está permitido ya que el valor del parámetro predeterminado debe conocerse en tiempo de compilación para que el compilador lo pueda hornear en el ensamblado.

+0

"hornear en el ensamblado ": las personas pasan por alto el hecho de que cambiar el valor predeterminado de un parámetro en una biblioteca no lo cambiará en un código de cliente que no se haya recompilado. –

Cuestiones relacionadas