Вообще, кидать исключения в свойствах - такое себе.
В вашем случае стоит сделать так:
public string? Top => _elements.LastOrDefault(); // Обычный метод Last кидает исключение, если коллекция пустая
Если бы так нельзя было бы сделать, пришлось бы завернуть всё в try-catch. Например так:
string? top = null;
try {
top = s.Top;
catch {}
Console.WriteLine($"Количество элементов в стеке: <{s.Size}>, верхний элемент стека: <{(top == null ? "null" : top)}>");
Кстати, чтобы дважды не вычислять s.Top в тернарнике - можно использовать сопоставление с образцом
s.Top is {} t ? t : "null"
;
Ещё вариант - оставить всё как есть, но иначе составлять сообщение:
var msg = s switch {
{ Size: 0 } => $"Стек пуст",
{ Size: var size, Top: var top} => $"Количество элементов в стеке: <{size}>, верхний элемент стека: <{top}>"
};
Console.WriteLine(msg);