https://docs.microsoft.com/pl-pl/dotnet/csharp/language-reference/tokens/interpolated
Lepiej niż tutaj nigdzie nie znajdziesz :)
public string FullName = $"{FirstName} + {LastName}"; możesz zrobić, ale nie jeśli mowa o polach klasy, dlaczego ?
Ponieważ jak kolega napisał, w funkcji masz dostęp do zmiennych, bo one wywołują się linia po lini, natomiast w sytuacji kiedy masz klase pola są tworzone nie według - tego jak zbudowana jest klasa tzn linia po lini, ale według konwencji języka.
Zwyczajnie jest to : najpierw tworzenie wszystkich obiektów "bazowych" jeśli jest dziedziczenie to bedą to konstruktory nad klasy, potem tworzone są wszystkie "statyczne bloki", następnie wszystkie statyczne pola, w tym także filalne, potem dopiero jest ładowane pole klasy - w kolejności- a dopiero na końcu jest wołany konstruktor klasy.
Stąd
public string FullName => $"{FirstName} + {LastName}";
w tej wersji, masz wyrażenie funkcyjne - a wyrażenie funkcyjne (lambda) wywoła się zawsze po inicjalizacji pól, stąd jak kolega pisał- masz gwarancje że FirstName, LastName o ile zostały zdefiniowane, to istnieją.
w poprzedniej sytuacji, nie masz gwarancji na to, że public string FullName jeśli nie jest wyrażeniem funkcyjnym a polem, to zostanie powołane w odp. kolejności, gdyż nie bedąc wyrażeniem ono nie mai nformacji jeszcze o innych polach
Tu masz do poczytania o class-path
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/classes