ДЖокен.FromObject на объекте notnull

#c# #json.net

Вопрос:

У меня есть следующий метод расширения:

 public static T FromJson<T>(JToken json) where T : notnull  => json.ToObject<T>();
 

Обновление до последней версии Json.СЕТЬ, которую я теперь получаю:

Возможное возвращение нулевой ссылки.

Учитывая ограничение шаблона, можно ли игнорировать эту ошибку ? то есть могу ли я добавить восклицательный знак вот так?

 public static T FromJson<T>(JToken json) where T : notnull  => json.ToObject<T>()!;
 

Комментарии:

1. Необязательно. Возвращаемое JValue.CreateNull() значение не равно null JToken , соответствующее строке JSON null , но если вы десериализуете его в ссылочный тип, не допускающий значения null, я считаю, что Json. СЕТЬ все равно вернется null .

2. Да, похоже , ваш метод JsonExtensions.FromJson<SomeReferenceType>(JValue.CreateNull()) вернется null , см. dotnetfiddle.net/LwqZc8 , потому что ненулевое JToken значение может десериализоваться до null значения. Видишь dotnetfiddle.net/LwqZc8 . Это ответ на ваш вопрос?

Ответ №1:

Как указано в приведенных выше комментариях @dbc json.ToObject<T>() все еще может возвращать значение null, даже если T ограничение равно notnull

В итоге я получил:

 public static T FromJson<T>(JToken json) where T : notnull => json.ToObject<T>() ?? throw new ArgumentException(typeof(T).ToString()); 
 

Комментарии:

1. Почему вы бросаете NRE вместо ArgumentException или любое из его производных исключений?

2. Хороший вопрос .. изменился