using static System.Console;

int nieMozeBycNull = 4;
//nieMozeBycNull = null; // błąd kompilacji!

int? mozeBycNull = null;
WriteLine(mozeBycNull);
WriteLine(mozeBycNull.GetValueOrDefault());

mozeBycNull = 7;
WriteLine(mozeBycNull);
WriteLine(mozeBycNull.GetValueOrDefault());

// Deklarowanie nienullowalnych zmiennych i parametrów

// klasa Adres jest definiowana przed klasą Program
Adres address = new();
address.Budynek = null;
address.Ulica = null;
address.Miasto = "Wrocław";
address.Region = null;

// Sprawdzanie wartości null

string nazwiskoAutora = null;

// Poniższa instrukcja rzuca wyjątek NullReferenceException
// int x = nazwiskoAutora.Length;

// Ta instrukcja nie rzuca wyjątku, a zmiennej y przypisywana jest wartość null.
int? y = nazwiskoAutora?.Length;

WriteLine($"y jest null: {y is null}");

// jeżeli nazwiskoAutora.Length ma wartość null, to wynik otrzyma wartość 3
int wynik = nazwiskoAutora?.Length ?? 3;
WriteLine(wynik);

class Adres
{
  public string? Budynek;
  public string Ulica = string.Empty;
  public string Miasto = string.Empty;
  public string Region = string.Empty;
}
