Страницы

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

вторник, 28 января 2020 г.

Правильное использование ограничений в обобщённых типах

#c_sharp #generics


Есть интерфейс IRepository:

public interface IRepository where 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 X where P : ISomething where Q : Base { } class Provider : IRepository>> { } У нас есть констрейнт на X>, но как превратить его в эффективный констрейнт на T, непонятно.

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

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