Кажется, что на ответ намекает (но не полностью объясняет) примечание в примечаниях в документации:
Этот метод не анализирует содержимое JSON строковое значение.
Но я все еще был сбит с толку, пока не нашел несколько комментариев в выпуске github, описывающих эти методы. Вот фрагмент этого комментария (слегка опущен, **
добавлен мной):
// InvalidOperationException if Type is not True or False
public bool GetBoolean();
// InvalidOperationException if Type is not Number
// FormatException if value does not fit
public decimal GetDecimal();
public double GetDouble();
public int GetInt32();
// InvalidOperationException if Type is not Number
// false if value **does not fit.**
public bool TryGetDecimal(out decimal value);
public bool TryGetDouble(out double value);
public bool TryGetInt32(out int value);
Итак, в конечном итоге все сводится к разнице между FormatException
и InvalidOperationException
.
Последний используется, чтобы указать, что ValueKind
токена (Number, String, True, False) не соответствует ожидаемому типу. Первый (FormatException
) используется немного не по метке, чем можно было бы ожидать; вместо того, чтобы выдаваться за ошибки анализа * (ie. «1.sg» не является int
), он выдается за ошибки вне диапазона !
Это лучше Понятно, если мы сначала посмотрим на число перегрузок c. Варианты, отличные от Try
, либо возвращают значение, либо вызывают одно из двух исключений: InvalidOperationException
, если значения не являются числами, FormatExceptions
, если они не подходят . Из документации для GetInt32
:
Исключения
InvalidOperationException
Это значение ValueKind
не Number
.
FormatException
Значение не может быть представлено как Int32
.
Сравните это с вариантами Try
, которые вызывают одно исключение - InvalidOperationException
, если тип не является числом - но возвращает false
, если значение не подходит. Из документации для TryGetInt32
:
Исключения
InvalidOperationException
Это значение ValueKind
не Number
.
Возвращает
Boolean true
, если число может быть представлено как Int32
; в противном случае false
.
В этом случае «не подходит» означает, что значение слишком велико / мало для базового типа, ie. больше int.MaxValue
при использовании [Try]GetInt32
Теперь давайте вернемся к случаю booleans
, где вы правильно заметили, что существует только вариант, отличный от Try
. Глядя на комментарии в том же выпуске github, мы видим следующее:
// InvalidOperationException if Type is not True or False
public bool GetBoolean();
И документация:
Исключения
InvalidOperationException
Это значение ValueKind
не является ни True
, ни False
.
Здесь отсутствует FormatException
и случай «не подходит». Как мы видели выше в случае чисел, вариант Try
дает нам определение «да, это число, но оно выходит за пределы допустимого диапазона». Booleans
имеет только два возможных значения - true
и false
- нет диапазона для определения, нет FormatException
, от которого можно было бы отличить guish. Аналогично strings
- либо это токен string
, либо нет.
Важно отметить, что во всех случаях выдается InvalidOperationException
, если ValueKind
не соответствует тому, что ожидается по методу. Гипотетический TryGetBoolean
не вернет false
, если встретит string
значение «ab c», он выдаст InvalidOperationException
, потому что ValueKind
не был True
или False
. Но это уже то, что делает GetBoolean
! Так что нет необходимости в отдельном методе.
* Примечание : ошибки синтаксического анализа нет, потому что методы фактически не попытка синтаксического анализа чисел / логических значений внутри токена json string
, они учитывают только значения правильного типа токена. Другими словами, числа в кавычках / bools в настоящее время не поддерживаются:
{
"number": 1234,
"notNumber": "1234",
"bool": true,
"notBool": "false"
}
В настоящее время (2020-05-30) имеется запрос на добавление поддержки для этого. В это время мы можем увидеть изменение доступности / функциональности методов TryGet
.