Mam opcjonalny parametr typu IEnumerable<int>
w mojej metodzie C#. Czy mogę zainicjować go za pomocą niczego innego niż null
, np. stała lista wartości?Zainicjuj IEnumerable <int> jako opcjonalny parametr
Odpowiedz
Nie. Możliwe są tylko stałe czasowe kompilacji. można przypisać w null, a następnie
void SomeMethod(IEnumerable<int> list = null)
{
if(list == null)
list = new List<int>{1,2,3};
}
Następny fragment kodu jest wziąć ze znanego C# in Depth
książki Jon Skeet
. Strona 371. Proponuje użyć wartości null jako rodzaju wskaźnika not set
dla parametrów, które mogą mieć znaczące wartości domyślne.
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);
}
}
Wykorzystanie
AppendTimestamp("utf8.txt", "First message");
AppendTimestamp("ascii.txt", "ASCII", Encoding.ASCII);
AppendTimestamp("utf8.txt", "Message in the future", null, new DateTime(2030, 1, 1));
Nie - parametry domyślne muszą być stałymi w czasie kompilacji.
Najlepiej jest przeciążać metodę. Możesz również ustawić wartość domyślną na null, a wewnątrz metody wykryć wartość pustą i zamienić ją na wybraną listę.
Jak o zrobienie jego domyślną wartość jako null, oraz w sposobie
numbers = numbers ?? Enumerable.Empty<int>();
lub
numbers = numbers ?? new []{ 1, 2, 3}.AsEnumerable();
Nie, trzeba czasu kompilacji stały.
Ale można użyć przeciążenie jak obejść:
public void Foo(int arg1)
{
Foo(arg1, new[] { 1, 2, 3 });
}
public void Foo(int arg1, IEnumerable<int> arg2)
{
// do something
}
Myślę, że chcesz wywołać pierwszą metodę z drugiej, ale +1 –
@lazyberezovsky: już edytowane, dziękuję. –
Dobrze ponieważ trzeba kompilować stałe czasowe trzeba by ustawić go null
ale wtedy można wykonać następujące czynności w metodzie
- 1. Doxygen - zadeklaruj parametr jako opcjonalny
- 2. Kotlin wyrażenia lambda jako opcjonalny parametr
- 3. Akcja jako parametr opcjonalny w funkcji
- 4. Parametr opcjonalny PHPDoc
- 5. Wartość tabeli opcjonalny parametr
- 6. opcjonalny parametr zawsze wypełniona
- 7. Opcjonalny parametr dyrektywy kątowej
- 8. Opcjonalny parametr szablonu
- 9. Opcjonalny parametr trasy Backbone.js
- 10. Compojure: opcjonalny parametr URL
- 11. Opcjonalny parametr inicjalizacji klasy
- 12. Dlaczego IEnumerable <T> jest zdefiniowany jako IEnumerable <out T>, nie IEnumerable <T>
- 13. DateTime jako parametr opcjonalny (domyślnie "teraz", nie puste)?
- 14. parametr opcjonalny UriTemplate użyciu WebGet
- 15. Opcjonalny parametr na środku trasy
- 16. List.AddRange z IEnumerable <T> parametr nie działa?
- 17. Jak zdefiniować @Value jako opcjonalny
- 18. IEnumerable <IEnumerable <T>> do IEnumerable <T> użyciu LINQ
- 19. ASP WebAPI ogólny Lista opcjonalny parametr
- 20. Jak przekazać opcjonalny parametr zamknięcia do funkcji?
- 21. Spłaszczyć IEnumerable <IEnumerable <>>; zrozumienia rodzajowych
- 22. Przesyłanie z IEnumerable <Object> do IEnumerable <string>
- 23. Zainicjuj statyczną prywatną mapę jako pustą
- 24. Użyj IQueryable.Count <T> z IEnumerable <T> parametr
- 25. Opcjonalny parametr GET w trasy ekspresowe
- 26. Ustawienie wartości domyślnej C# opcjonalny parametr
- 27. spring-data-mongodb opcjonalny parametr zapytania
- 28. Routing atrybutów - parametr opcjonalny nie działa?
- 29. Jak ustawić parametr opcjonalny bez kompilacji stałą
- 30. Opcjonalny parametr w przypadku enum w szybkim
Naprawdę niesamowitym efektem ubocznym tego wzorca jest to, że nie napotykasz problemu związanego z domyślnymi parametrami wywołania strony wywołania, jeśli wystawiasz je przez niektóre biblioteki klas, ponieważ pozwala to na modyfikację wartości domyślnych i włączenie ich w momencie aktualizacji biblioteki. W ten sposób unikając tego problemu: http://stackoverflow.com/a/664691/84206 – AaronLS