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

Przeciążenie operatora konwersji - null

VPS Starter Arubacloud
+1 głos
368 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 (277,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,017 wizyt
pytanie zadane 26 lipca 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)
0 głosów
2 odpowiedzi 1,048 wizyt
pytanie zadane 6 stycznia 2017 w C i C++ przez Ala123456 Użytkownik (760 p.)

93,028 zapytań

141,991 odpowiedzi

321,294 komentarzy

62,375 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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...