C# 为什么我在使用“时看到错误”;“工作单位”;使用通用接口?

C# 为什么我在使用“时看到错误”;“工作单位”;使用通用接口?,c#,C#,我有一个名为:GenericRepository的泛型类存储库,还有一个名为:IGenericRepository的泛型接口,Product是我在数据库中的一个表 当我以这种方式使用通用存储库的“工作单元”时: public class UnitOfWork: IDisposable { GroceryStore_DBEntities db = new GroceryStore_DBEntities(); private IGenericRepository<Product

我有一个名为:
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;
        }
    }}
公共类UnitOfWork:IDisposable
{
GroceryStore_DBEntities db=新的GroceryStore_DBEntities();
私人IGenericRepository(通用repository);;
公共地理位置一般地理位置
{
得到
{
if(_genericRepository==null)
{
_genericRepository=新的genericRepository(db);
}
返回-一般存储;
}
}}
我面临以下两个错误:

  • 错误CS0311类型“GroceryStore.DataLayer.Context.Product”不能用作泛型类型或方法“GenericRepository”中的类型参数“TEntity”。没有从“GroceryStore.DataLayer.Context.Product”到“GroceryStore.DataLayer.Repositories.IGenericRepository”的隐式引用转换

  • 无法将类型“GroceryStore.DataLayer.Services.GenericRepository”隐式转换为“GroceryStore.DataLayer.Repositories.IGenericRepository”。存在显式转换(是否缺少强制转换?)

  • 你能告诉我哪里出错了吗?为什么?我怎样才能解决这个问题


    我有以下声明:

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

    公共接口IGenericRepository
    地点:班级
    { }
    公共类通用存储库
    其中tenty:类,iGeneric存储
    { }
    
    您写道:

    public interface IGenericRepository<TEntity>
      where TEntity: class 
    { } 
    public class GenericRepository<TEntity> 
      where TEntity:class, IGenericRepository<TEntity>
    { }
    
    也就是说,T的排序列表要求T与其他T可比较

    我想你的意图是

    public class GenericRepository<TEntity> :
      IGenericRepository<TEntity>
      where TEntity:class
    { }
    
    公共类通用存储库:
    IGenericRepository
    地点:班级
    { }
    
    对吧?基类和接口列表位于约束之前;您将其放入约束中。

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

    class ClassName<T> : 
      BaseClass, 
      IInterface1, 
      IInterface2 
      where 
      T : CONSTRAINT,
          CONSTRAINT,
          ...
    
    类名:
    基类,
    界面1,
    界面2
    哪里
    T:约束,
    约束,
    ...
    

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

    问题似乎在于如何定义
    genericsposition
    。我们看不到。请显示类和接口的约束,例如您的
    IGenericRepository
    类有一个奇怪的约束,可能
    where tenty:IGenericRepository
    。公共接口IGenericRepository where tenty:class公共类GenericRepository where tenty:class,IGenericRepository
    GenericRepository where tenty:class,IGenericRepository
    应该是
    GenericRepository:IGenericRepository where tenty:class
    谢谢。它起作用了。但是你能告诉我代码错误的原因吗?@MohammadYoosefiyan:我会补充一些注释。但你真的应该读一下C#规范。它详细描述了类声明的各个部分以及它们必须出现的顺序。非常感谢“Eric”。正如你所说,我不知道带约束的语法。另外,我还有一个问题:“BaseClass”是什么意思?@MohammadYoosefiyan:如果你不了解OO编程的基础知识,你就不应该在泛型类型的高级主题上乱搞!在尝试做高级工作之前,先了解基础知识。
    class ClassName<T> : 
      BaseClass, 
      IInterface1, 
      IInterface2 
      where 
      T : CONSTRAINT,
          CONSTRAINT,
          ...