在通用接口上使用“工作单元”时,为什么会看到错误?

Moh*_*yan 0 c#

我有一个名为:的通用类存储库GenericRepository,还有一个名为:的通用接口,IGenericRepository并且Product是数据库中的表之一。

当我通过这种方式将“工作单元”与此通用存储库一起使用时:

public class UnitOfWork: IDisposable
{
    GroceryStore_DBEntities db = new GroceryStore_DBEntities();
    private IGenericRepository<Product> _genericRepository;
    public IGenericRepository<Product> GenericRepository
    {
        get
        {
            if (_genericRepository == null)
            {
                _genericRepository = new  GenericRepository<Product>(db);
            }
            return _genericRepository;
        }
    }}
Run Code Online (Sandbox Code Playgroud)

我遇到2个错误,您可以在下面看到:

  1. 错误CS0311类型'GroceryStore.DataLayer.Context.Product'不能用作通用类型或方法'GenericRepository <TEntity>'中的类型参数'TEntity'。没有从'GroceryStore.DataLayer.Context.Product'到'GroceryStore.DataLayer.Repositories.IGenericRepository <GroceryStore.DataLayer.Context.Product>'的隐式引用转换。

  2. 无法将类型'GroceryStore.DataLayer.Services.GenericRepository <GroceryStore.DataLayer.Context.Product>'隐式转换为'GroceryStore.DataLayer.Repositories.IGenericRepository <GroceryStore.DataLayer.Context.Product>'。存在显式转换(您是否缺少演员表?)

你能告诉我我哪里出问题了吗?为什么?以及我该如何解决?


我有以下声明:

public interface IGenericRepository<TEntity>
    where TEntity: class
{ }

public class GenericRepository<TEntity>
    where TEntity: class, IGenericRepository<TEntity>
{ }
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 6

你写了:

public interface IGenericRepository<TEntity>
  where TEntity: class 
{ } 
public class GenericRepository<TEntity> 
  where TEntity:class, IGenericRepository<TEntity>
{ }
Run Code Online (Sandbox Code Playgroud)

这意味着TEntity中的GenericRepository<TEntity>必须是实体的存储库。

这种约束是合法的,但通常用于

class SortedList<T> where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)

也就是说,T的排序列表要求T与其他T相当。

我想你的意图是

public class GenericRepository<TEntity> :
  IGenericRepository<TEntity>
  where TEntity:class
{ }
Run Code Online (Sandbox Code Playgroud)

对?基类和接口的列表位于约束之前。您将其置于约束中。

也就是说,类声明如下所示:

class ClassName<T> : 
  BaseClass, 
  IInterface1, 
  IInterface2 
  where 
  T : CONSTRAINT,
      CONSTRAINT,
      ...
Run Code Online (Sandbox Code Playgroud)

约束也必须按照正确的顺序排列。如果对类声明的语法有疑问,请阅读C#规范。您似乎对事情发生的顺序有些困惑。