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

Przeciążenie operatora konwersji - null

Object Storage Arubacloud
+1 głos
332 wizyt
pytanie zadane 14 czerwca 2021 w C# przez everstudybee Użytkownik (610 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 (269,770 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 (610 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 (610 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ź 908 wizyt
pytanie zadane 26 lipca 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
2 odpowiedzi 979 wizyt
pytanie zadane 6 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)

92,567 zapytań

141,420 odpowiedzi

319,616 komentarzy

61,953 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...