Wpis z mikrobloga

Macie zagadkę dla prosów:

var request = new HttpRequestMessage() { Headers = { { "test", "bla" } } };
Headers nie ma w ogóle settera a powyższe się kompiluje i działa ( ͡° ͜ʖ ͡°)

Kto pierwszy wyjaśni wygrywa plusa

#csharp #dotnet
  • 12
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@budyn: Taka inicjalizacja nie nadpisuje trzymanej tam kolekcji nowym obiektem, a jedynie dodaje "test", "bla" do już istniejącej kolekcji, pewnie niejawnie wołając Add(). W tym brak settera nie przeszkadza
  • Odpowiedz
@budyn: zgadzam się z @Czesiowcy: jest to po prostu sprytne i dość zaskakujące użycie inicjalizatorów listy i słownika, które najwyraźniej są ducktyped z metodą .Add() na interfejsach kolejno IEnumerable<> oraz KeyValuePair<,>. O duck typingu przekonuje mnie sygnatura klasy public abstract class HttpHeaders : IEnumerable>>, IEnumerable (brak dziedziczenia po List<> lub Dictionary<,>).
Okazuje się, że te inicjalizatory można używać nie tylko przy tworzeniu obiektów typu lista lub słownik, ale
  • Odpowiedz