• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przeciążenie operatora konwersji - null

+1 głos
512 wizyt
pytanie zadane 14 czerwca 2021 w C# przez everstudybee Użytkownik (670 p.)

Hej, mam problem w klasie Produkt w konstruktorze. Chciałbym aby pole OpakowanieProduktu mogło przyjmować wartość null. Niestety nie pomaga dołożenie ? i VisualStudio pokazuje następujący błąd.

W jaki sposób mogę umożliwić by w sytuacji gdy podczas konstruowania produktu nie podam opakowania, to stworzony obiekt w polu OpakowanieProduktu będzie przechowywał null?

using System;

namespace Test
{
    class Program
    {
        internal enum Material : byte
        {
            Papier,
            Folia
        }
        struct Opakowanie
        {
            private Material Material { get;}

            public Opakowanie(Material material)
            {
                Material = material;
            }

            public override string ToString() => $"material: {Material}";
        }

        class Produkt
        {
            private string Nazwa { get;}
            private Opakowanie? OpakowanieProduktu { get;}

            public Produkt(string nazwa, Opakowanie opakowanieProduktu = null)
            {
                Nazwa = nazwa;
                OpakowanieProduktu = opakowanieProduktu;
            }

            public override string ToString()
            {
                return "=== INFORMACJA O PRODUKCIE ===\n" +
                       $"Nazwa produktu: {Nazwa}\n" +
                       $"Opakowanie produktu: {OpakowanieProduktu}\n";
            }
        }

        static void Main(string[] args)
        {
            Opakowanie opakowanie = new Opakowanie(Material.Papier);
            Produkt produkt = new Produkt("Telewizor", opakowanie);
            Console.WriteLine(produkt);
            Produkt produkt2 = new Produkt("Telewizor");
            Console.WriteLine(produkt2);
        }
    }
}

 

2 odpowiedzi

+1 głos
odpowiedź 15 czerwca 2021 przez kubaapk Nałogowiec (44,270 p.)

Dodaj "?" do drugiego parametru w konstruktorze Produkt -> "Opakowanie? opakowanieProduktu = null". Struktury są value-type, więc, aby ustawić im domyślną wartość null musisz explicite wskazać, że mogą być nullowalne. 

0 głosów
odpowiedź 14 czerwca 2021 przez Wiciorny Ekspert (282,600 p.)
private Opakowanie? OpakowanieProduktu { get;}

zauważ co jest wykonywane w tej lini :) sugeruje ustawiać coś na bazie 

private ClassField{
 
    get { return _SomeInfo ?? String.Empty; }
    set { _SomeInfo = value; }
  }

 

komentarz 14 czerwca 2021 przez everstudybee Użytkownik (670 p.)
edycja 14 czerwca 2021 przez everstudybee

Bardzo dziękuję za odpowiedź, niestety nie umiem jej wykorzystać :( cały czas coś jest nie tak. Otrzymuję teraz dodatkowo taki komunikat.

Tak zmieniłem klasę Produkt

class Produkt
        {
            private string Nazwa { get;}
            private Opakowanie _opakowanieProduktu;
            public Opakowanie OpakowanieProduktu
            {
                get => _opakowanieProduktu ?? String.Empty;
                set => _opakowanieProduktu = value;
            }

            public Produkt(string nazwa, Opakowanie opakowanieProduktu = null)
            {
                Nazwa = nazwa;
                OpakowanieProduktu = opakowanieProduktu;
            }

            public override string ToString()
            {
                return "=== INFORMACJA O PRODUKCIE ===\n" +
                       $"Nazwa produktu: {Nazwa}\n" +
                       $"Opakowanie produktu: {OpakowanieProduktu}\n";
            }
        }

Może do dalszych rozważań będzie ważne po co to wszystko. Zadanie, które rozwiązuje w ostatnim punkcie każe tak napisać kod by w przypadku gdy nie podamy podczas tworzenia produktu opakowania to wartość pola opakowanie zwróci null. Szukałem rozwiązanie kilka godzin i zaczynam powoli się poddawać.

komentarz 15 czerwca 2021 przez everstudybee Użytkownik (670 p.)

Dla potomny, może się komuś przyda :D Zmiany dotyczą tylko klasy Produkt (w porównaniu z kodem oryginalnym)

class Produkt
        {
            private string Nazwa { get; }
            private Opakowanie? OpakowanieProduktu { get; }
            
            public Produkt(string nazwa)
            {
                Nazwa = nazwa;
                OpakowanieProduktu = null;
            }

            public Produkt(string nazwa, Opakowanie opakowanieProduktu)
            {
                Nazwa = nazwa;
                OpakowanieProduktu = opakowanieProduktu;
            }

            public override string ToString()
            {
                return "=== INFORMACJA O PRODUKCIE ===\n" +
                       $"Nazwa produktu: {Nazwa}\n" +
                       $"Opakowanie produktu: {(OpakowanieProduktu.Equals(null) ? "null" : OpakowanieProduktu.ToString())}\n";
            }
        }

 

Podobne pytania

0 głosów
1 odpowiedź 1,210 wizyt
pytanie zadane 26 lipca 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
2 odpowiedzi 1,259 wizyt
pytanie zadane 6 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)

93,631 zapytań

142,553 odpowiedzi

323,056 komentarzy

63,138 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2658p. - dia-Chann
  2. 2630p. - DziarnowskiJ
  3. 2550p. - raydeal
  4. 2478p. - rucin93
  5. 2361p. - Łukasz Piwowar
  6. 2348p. - Łukasz Eckert
  7. 2340p. - CC PL
  8. 2300p. - Adrian Wieprzkowicz
  9. 2082p. - Michal Drewniak
  10. 1957p. - Maurycy W
  11. 1885p. - robwarsz
  12. 1811p. - rafalszastok
  13. 1600p. - Rafał Trójniak
  14. 1588p. - Tomasz Bielak
  15. 1494p. - ssynowiec
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...