Ich habe einen optionalen Parameter des Typs IEnumerable<int>
in meiner C# -Methode. Kann ich es mit irgendetwas außer null
initialisieren, z. eine feste Liste von Werten?Initialisieren IEnumerable <int> als optionalen Parameter
Antwort
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));
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.
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();
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
}
Ich denke, Sie möchten die erste Methode aus dem zweiten, aber +1 –
@lazyberezovsky aufrufen: bereits bearbeitet, danke. –
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};
- 1. IEnumerable <T> als Rückgabetyp
- 2. konvertieren/Cast IEnumerable IEnumerable <T>
- 3. IEnumerable <IEnumerable <T>> zu IEnumerable <T> LINQ mit
- 4. IEnumerable <> zu IList <>
- 5. Kann String.Empty nicht als Standardwert für einen optionalen Parameter verwenden
- 6. ReSharper: Nutze einen optionalen Parameter
- 7. IEnumerable <T> Frage
- 8. TopN als IEnumerable Erweiterung
- 9. zu IEnumerable <T>
- 10. Wie man ein `IEnumerable <Unknown T>` auf `IEnumerable <Whatever>`
- 11. Verwenden eines IEnumerable <T> als einen Delegat-Rückgabetyp
- 12. Wie stelle ich einen optionalen Parameter in PHP nach dem ersten optionalen Parameter
- 13. Holen Sie sich ein IEnumerable <T> aus einem IEnumerable <IEnumerable <T>>
- 14. IEnumerable <string> bespannen
- 15. XML IEnumerable <T>
- 16. Pivot IEnumerable <T>
- 17. EntitySet <IEnumerable <T>> zu IEnumerable <T>
- 18. LINQ: IEnumerable <KeyValuePair <Sometype, IEnumerable <OtherType> >> Auswahl
- 19. StructureMap und IEnumerable injizieren <T>
- 20. C++ verwendet string nach << als Parameter
- 21. C++ Stream als Parameter, wenn eine Überlastung Operator <<
- 22. Gibt es eine Möglichkeit, Parameter als optionalen Parameter in C# zu verwenden?
- 23. Android-Aktivität: Wo Parameter initialisieren?
- 24. Warum akzeptiert eine Funktion IEnumerable <interface> IEnumerable <class> nicht?
- 25. IEnumerable <object> zur Liste <object>
- 26. Vermeiden Sie die Langeweile der optionalen Parameter
- 27. einen optionalen Parameter des Typs System.Drawing.Color
- 28. dynamisch Abfrage in HQL mit optionalen Parameter?
- 29. Kann ein Delegierter einen optionalen Parameter haben?
- 30. Eine Methode mit einem optionalen Parameter
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