2010-04-21 8 views
6

C# 4.0 apporte des paramètres facultatifs que j'attendais depuis un certain temps. Cependant, il semble que parce que seuls les types de systèmes peuvent être const, je ne peux utiliser aucune classe/struct que j'ai créée en tant que paramètre facultatif.Paramètres de type non-système optionnels

Existe-t-il un moyen qui me permette d'utiliser un type plus complexe en tant que paramètre optionnel. Ou est-ce une des réalités avec laquelle il faut simplement vivre?

+0

Il n'y a aucune restriction quant à " Types de systèmes ". Qu'est-ce qui vous amène à croire cela? –

+0

ils peuvent être d'autres types, mais la seule valeur par défaut disponible est null (ou peut-être quelque chose dont le type peut implicitement convertir mais je ne peux pas le tester car je n'ai pas 4.0 au travail)) –

Répondre

10

Le mieux que je pouvais trouver pour les types de référence était:

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

Vous pouvez utiliser la même idée pour struct en faisant le paramètre annulable:

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

Je pensais dans ce sens mais comme j'utilisais une structure, ça ne me plaisait pas non plus. Je ne sais pas pourquoi je n'ai pas fait que le func prenne une version nullable (Size? Size = null) cependant. –

+0

System.Nullable ... Maintenant, je me souviens où j'ai eu l'idée d'un champ "initialisé" supplémentaire dans la structure. :) –

+1

Pour info, vous pouvez toujours utiliser le ?? opérateur avec une structure nullable. –

6

Vous pouvez utiliser tout type comme paramètre optionnel:

using System; 

class Bar { } 

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

D'accord, je relis votre question et je pense que je vois ce que vous voulez dire - vous voulez être en mesure de faire quelque chose comme ceci:

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

Malheureusement, ceci est interdit car la valeur du paramètre par défaut doit être connue au moment de la compilation pour que le compilateur puisse le faire dans l'assemblage.

+0

assembly "- Les gens oublient le fait que changer la valeur par défaut d'un paramètre dans une bibliothèque ne le changera pas dans le code client qui n'a pas été recompilé. –

Questions connexes