Generic T - создать новый экземпляр

У меня есть функция для десериализации любого типа объекта, который я получаю от API. Если есть ошибка, я хочу вернуть новый объект типа T.

Я пытался сделать это с помощью return new T(), но получаю ошибку:

«T» должен быть неабстрактным типом с общедоступным конструктором без параметров, чтобы использовать его в качестве параметра «T» в универсальном типе или методе.

Что не так с моим кодом?

[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")]
        internal static T DeserializeObject<T>(this JsonSerializer serializer, string value) 
        {
            try
            {
                using (var stringReader = new StringReader(value))
                {
                    using (var jsonTextReader = new JsonTextReader(stringReader))
                    {
                        return (T)serializer.Deserialize(jsonTextReader, typeof(T));
                    }
                }
            }

            catch {

                return GetDefault<T>(); //This line returns the error
            }  
        }


        public static T GetDefault<T>() where T : new()
        {
            if (typeof(IEnumerable).IsAssignableFrom(typeof(T)))
            {
                return new T();
            }
            return default(T);
        }

person Miri Nulman    schedule 16.06.2017    source источник
comment
@ Коди Грей Разве ты не видел? Он уже использует ограничение типа! Проблема в другом   -  person adjan    schedule 16.06.2017
comment
@adjan OP использует ограничение типа только в одном месте. Строка с ошибкой находится в методе без ограничения типа. Так что это все еще дубликат.   -  person user247702    schedule 16.06.2017
comment
@Stijn, но где в другом вопросе говорится, что это требование обязательно для каждого метода?   -  person adjan    schedule 16.06.2017
comment
@adjan абзац под первым блоком кода в ответе объясняет это.   -  person user247702    schedule 16.06.2017
comment
@AndersonPimentel Я знаю об этом. Я просто не понимаю, где дублирующийся ответ объясняет это.   -  person adjan    schedule 16.06.2017
comment
@Stijn Где? я не вижу?   -  person adjan    schedule 16.06.2017
comment
@Cody Grey Я отредактировал ответ на то, что считаю хорошим. Я не мог дать ответ сам, потому что вы закрыли его без причины.   -  person adjan    schedule 16.06.2017
comment
согласен с @adjan, на самом деле это не дубликат, и поэтому проголосовали за повторное открытие   -  person Rahul    schedule 16.06.2017


Ответы (1)


В DeserializeObject<T> вы звоните

GetDefault<T>()

который имеет ограничение параметра типа where T : new(), но T DeserializeObject<T> не имеет ограничений. Вы также должны добавить ограничение к DeserializeObject<T>:

internal static T DeserializeObject<T>(this JsonSerializer serializer, string value) : where T : new()
person Rahul    schedule 16.06.2017
comment
Большое спасибо, это сработало - person Miri Nulman; 16.06.2017
comment
@adjan Я признаю, что отвечал с закрытой Visual Studio. =) Только что удалил комментарий. - person Anderson Pimentel; 16.06.2017
comment
@Rahul Я вижу это, и теперь я понял. Просто удалил комментарий. - person Anderson Pimentel; 16.06.2017
comment
@adjan, ценю ваше редактирование в ответе. Спасибо - person Rahul; 16.06.2017
comment
@ Рахул Конечно. Но я не ценю людей, закрывающих вопросы по неправильной причине (не обвиняя вас, очевидно). - person adjan; 16.06.2017
comment
@adjan, имеет смысл, и я почти уверен, что они на самом деле не поняли вопроса, вероятно - person Rahul; 16.06.2017