Страницы

Поиск по вопросам

суббота, 7 марта 2020 г.

Странное поведение ограничений в обобщенном методе

#c_sharp #net #ооп


Всем доброго времени суток. Может быть кто-то уже сталкивался с таким и может помочь? 

public static class JSON
    {
        public static string Serialize_object_TO_JSON(this T Entity)
         where T:ENT
        {
            return JsonConvert.SerializeObject(Entity);
        }

    }


Есть некий класс, который наследует ENT и передавать его в атрибуты можно. Дальше
мне пришлось переделать метод так, чтоб она работал с коллекциями:

public static class JSON
        {
            public static string Serialize_object_TO_JSON(this T Entity)
             where T:List
            {
                return JsonConvert.SerializeObject(Entity);
            }

        }


После чего компилятор говорит, что ему не удалось привести тип класса, который наследуется
от ENT, к типу List. 

P.S. Изначально задавать обобщение конечного класса я не могу, т.к. их довольно много,
именно по этому попытался делать через наследование.
    


Ответы

Ответ 1



Попробуйте так, если Вам это разрешает бизнес логика: public static class JSON { public static string Serialize_object_TO_JSON(this T Entity) where T : IEnumerable { return JsonConvert.SerializeObject(Entity); } } Дело в том что List - инвариантен. И все классы в .NET инвариантны. То есть это полное соответствие типов. Означает, что можно использовать только изначально заданный тип. Таким образом, параметр инвариантного универсального типа не является ни ковариантным, ни контравариантным. С другой стороны есть IEnumerable где тип-параметр T помечен как out - ковариантным. Позволяет использовать тип с большей глубиной наследования, чем задано изначально. Полное описание почему так +1 за хороший пример

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

Отправить комментарий