Обычно я использую ?, чтобы присвоить переменную и позже проверить ноль.
Но это не работает в следующем контексте:
var value = PlayerGroup?.Players?[0]?.jsonData?.playerSetting?.useChat?.value ?? true;
Ожидается: value == true если PlayerGroup.Players имеет значение null или не имеет элементов в массиве.
Результат: ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Что ? следует ожидать в этом контексте?
Лично я считаю, что если вам приходится использовать так много вопросительных знаков, вы делаете свой код «слишком обнуляемым». Написание кода, в котором что-либо в любой момент может быть нулевым и требует проверки, утомительно; включите #nullable, объявляйте как можно меньше вещей со значением «может быть нулевым», начните давать разумные значения по умолчанию для вещей и не устанавливайте значения NULL добровольно там, где вы можете этому помочь.
Еще одна вещь, которую вам следует сделать, это следовать соглашению об именах C#, и там, где вам приходится работать с данными из json, используйте соответствующие атрибуты, чтобы сообщить C#, каково имя свойства json, а не называть свои члены C# в соглашении json. Это означает, что вы можете использовать любое имя C#, которое вам нравится, и оно по-прежнему будет формировать правильный json. Посмотрите, например. [JsonProperty("playerSetting")] public BlahBlah Settings {get;set;} (Newtonsoft; STJ — это JsonPropertyName)





Players?[0]?
Это не работает в случае, если значение Players не равно нулю, а пусто, как вы, кажется, уже поняли. Тогда Players[0] будут за пределами поля. Попробуйте использовать FirstOrDefault, если вы этого хотите. (?.FirstOrDefault()?.)
Как вы упомянули, это нулевая цепочка. Совсем другое дело — проверка пустоты коллекции.