Общие ограничения F #

#.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.
  

Но все ограничения существуют. Я что-то упускаю?

Редактировать:

Если вам нужно больше кода:

https://github.com/Ar3sDevelopment/Caelan .Фреймворки.BIZ/blob/fsharp/Caelan.Frameworks.BIZ/Classes.fs

это проект с открытым исходным кодом

Ответ №1:

Я не знаю, почему это сообщение об ошибке было отображено для моего кода, но я нашел обходной путь и зафиксировал проект GitHub. Вы можете проверить разницу в этом файле, потому что его легче прочитать, чем описать.

https://github.com/Ar3sDevelopment/Caelan .Фреймворки.BIZ/commit/22898671635b4667c8741853af9cc86910e1ff5a#diff-d5779b1053a390520d2a4a0c643f3d68

Ссылка содержит различие, которое решает вопрос, но я объясню это в следующих строках.

Я решил это с помощью обходного пути, я не знаю, почему он отображался.

В классе репозитория (классе репозитория в вопросе, а не в классе метода) есть эти члены:

 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
  

И я не могу объяснить, почему это устраняет ошибку, по крайней мере, я надеюсь, что это поможет.

Метод в вопросе остается тем же.