• 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
108 wizyt
pytanie zadane 14 czerwca 2021 w C# przez everstudybee Początkujący (490 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,490 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 (228,730 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 Początkujący (490 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 Początkujący (490 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ź 651 wizyt
pytanie zadane 26 lipca 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
2 odpowiedzi 694 wizyt
pytanie zadane 6 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (770 p.)

88,701 zapytań

137,308 odpowiedzi

306,748 komentarzy

58,894 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...