#c_sharp #generics
Есть интерфейс IRepository: public interface IRepositorywhere T : BaseModel {...} где BaseModel- базовый класс для моделей. Есть провайдер к базе данных, который реализует этот интерфейс: public class Provider : IRepository where T : BaseModel {...} Есть ли необходимость указывать ограничение на T в случае провайдера, если оно уже указано на уровне интерфейса?
Ответы
Ответ 1
Ну очень странный вопрос. Да нужно, потому что без него не компилируется: http://ideone.com/zfhSDo public class Provider: IRepository /* where T : BaseModel */ {} prog.cs(6,14): error CS0314: The type `T' cannot be used as type parameter `T' in the generic type or method `IRepository'. There is no boxing or type parameter conversion from `T' to `BaseModel' prog.cs(5,30): (Location of the symbol related to previous error) http://ideone.com/I26aUP public class Provider : IRepository where T : BaseModel {} А тут всё хорошо. Ответ 2
Если ваш вопрос на самом деле: почему ограничения на тип-параметр не наследуются от интерфейса — то вот ответ на этот вопрос Эрика Липперта, одного из (бывших) разработчиков языка. Вкратце: потому что в общем случае нету однозначного соответствия параметров класса и параметров интерфейса. Например, рассмотрим такое объявление: class Xwhere P : ISomething
where Q : Base { } class Provider: IRepository >> { } У нас есть констрейнт на X >, но как превратить его в эффективный констрейнт на T, непонятно.
Комментариев нет:
Отправить комментарий