2013-01-10 8 views

Antwort

8

Nein. Sie können nur Kompilierzeitkonstanten haben. Sie können in auf Null und dann

void SomeMethod(IEnumerable<int> list = null) 
{ 
    if(list == null) 
     list = new List<int>{1,2,3}; 
} 

Next Code-Schnipsel zuweisen aus bekannten C# in Depth Buch von Jon Skeet wird nehmen. Seite 371. Er schlägt vor, null als eine Art not set Indikator für Parameter zu verwenden, die sinnvolle Standardwerte haben können.

static void AppendTimestamp(string filename, 
          string message, 
          Encoding encoding = null, 
          DateTime? timestamp = null) 
{ 
    Encoding realEncoding = encoding ?? Encoding.UTF8; 
    DateTime realTimestamp = timestamp ?? DateTime.Now; 
    using (TextWriter writer = new StreamWriter(filename, true, realEncoding)) 
    { 
     writer.WriteLine("{0:s}: {1}", realTimestamp, message); 
    } 
} 

Nutzungs

AppendTimestamp("utf8.txt", "First message"); 
AppendTimestamp("ascii.txt", "ASCII", Encoding.ASCII); 
AppendTimestamp("utf8.txt", "Message in the future", null, new DateTime(2030, 1, 1)); 
+0

Der wirklich tolle Nebeneffekt dieses Musters ist, dass Sie das Problem mit Call-Site-Bindung von Standardparametern nicht auftreten, wenn Sie diese durch offen legen einige Klassenbibliotheken, da Sie damit die Standardwerte ändern und sie wirksam werden lassen können, wenn die Bibliothek aktualisiert wird. So vermeiden Sie dieses Problem: http://StackOverflow.com/a/664691/84206 – AaronLS

4

Nein - Standardparameter müssen Kompilierzeitkonstanten sein.

Am besten überladen Sie die Methode. Alternativ können Sie den Standardwert auf null setzen und innerhalb Ihrer Methode eine Null erkennen und in die gewünschte Liste umwandeln.

4

Wie wäre es den Standardwert als null zu machen und innerhalb der Methode

numbers = numbers ?? Enumerable.Empty<int>(); 

oder

numbers = numbers ?? new []{ 1, 2, 3}.AsEnumerable(); 
3

Nein, Sie eine Kompilierung benötigen Konstante.

Aber man könnte eine Überlastung als Arbeit nutzen um:

public void Foo(int arg1) 
{ 
     Foo(arg1, new[] { 1, 2, 3 }); 
} 

public void Foo(int arg1, IEnumerable<int> arg2) 
{ 
     // do something 
} 
+0

Ich denke, Sie möchten die erste Methode aus dem zweiten, aber +1 –

+0

@lazyberezovsky aufrufen: bereits bearbeitet, danke. –

3

Nun, da Sie Zeitkonstanten kompilieren würden Sie es null

gesetzt haben, aber dann können Sie die folgenden in Ihrer Methode tun

list = list ?? new List<int>(){1,2,3,4}; 
Verwandte Themen