#.net #generics #f# #constraints #f#-3.0
#.net #общие #f# #ограничения #f #-3.0
Вопрос:
У меня есть этот метод в классе:
member this.GetDbSet<'TEntity, 'TDTO, 'TKey when 'TKey :> IEquatable<'TKey> and 'TEntity :> IEntity<'TKey> and 'TEntity : not struct and 'TDTO :> IDTO<'TKey> and 'TEntity : equality and 'TEntity : null and 'TDTO : equality and 'TDTO : null and 'TKey : equality>(repository : BaseRepository<'TEntity, 'TDTO, 'TKey>) =
repository.DbSetFuncGetter().Invoke(uow.Context())
но когда я создаю проект, я получаю эту ошибку
This code is not sufficiently generic. The type variable 'TEntity when 'TEntity :> IEntity<'TKey> and 'TEntity : not struct and 'TEntity : equality and 'TEntity : null and 'TKey :> IEquatable<'TKey> and 'TKey : equality could not be generalized because it would escape its scope.
Но все ограничения существуют. Я что-то упускаю?
Редактировать:
Если вам нужно больше кода:
это проект с открытым исходным кодом
Ответ №1:
Я не знаю, почему это сообщение об ошибке было отображено для моего кода, но я нашел обходной путь и зафиксировал проект GitHub. Вы можете проверить разницу в этом файле, потому что его легче прочитать, чем описать.
Ссылка содержит различие, которое решает вопрос, но я объясню это в следующих строках.
Я решил это с помощью обходного пути, я не знаю, почему он отображался.
В классе репозитория (классе репозитория в вопросе, а не в классе метода) есть эти члены:
let mutable dbSetFunc : Func<DbContext, DbSet<'TEntity>> = null
member this.DbSetFunc
with set (value) = dbSetFunc <- value
member this.DbSetFuncGetter() = dbSetFunc
но они сгенерировали ошибку, я обнаружил, что она пытается их прокомментировать, и я изменил их на эти
[<DefaultValue>] val mutable dbSetFunc : Func<DbContext, DbSet<'TEntity>>
member this.DbSetFunc
with set (value) = this.dbSetFunc <- value
member internal this.DbSetFuncGetter() = this.dbSetFunc
И я не могу объяснить, почему это устраняет ошибку, по крайней мере, я надеюсь, что это поможет.
Метод в вопросе остается тем же.