为了账号安全,请及时绑定邮箱和手机立即绑定

为什么当我将“工作单元”与通用接口一起使用时会看到错误?

为什么当我将“工作单元”与通用接口一起使用时会看到错误?

C#
交互式爱情 2022-11-13 14:31:19
我有一个名为:的通用类存储库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;        }    }}我面临 2 个错误,您可以在下面看到:错误 CS0311 类型“GroceryStore.DataLayer.Context.Product”不能用作泛型类型或方法“GenericRepository<TEntity>”中的类型参数“TEntity”。没有从“GroceryStore.DataLayer.Context.Product”到“GroceryStore.DataLayer.Repositories.IGenericRepository<GroceryStore.DataLayer.Context.Product>”的隐式引用转换。无法将类型“GroceryStore.DataLayer.Services.GenericRepository<GroceryStore.DataLayer.Context.Product>”隐式转换为“GroceryStore.DataLayer.Repositories.IGenericRepository<GroceryStore.DataLayer.Context.Product>”。存在显式转换(您是否缺少转换?)你能告诉我哪里出错了吗?为什么?我该如何解决这个问题?
查看完整描述

1 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

你写了:


public interface IGenericRepository<TEntity>

  where TEntity: class 

{ } 

public class GenericRepository<TEntity> 

  where TEntity:class, IGenericRepository<TEntity>

{ }

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


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


class SortedList<T> where T : IComparable<T>

也就是说,T 的排序列表要求 T 与其他 T 具有可比性。


我想你的意图是


public class GenericRepository<TEntity> :

  IGenericRepository<TEntity>

  where TEntity:class

{ }

正确的?基类和接口的列表出现在约束之前;你把它放在约束中。


也就是说,类声明是这样的:


class ClassName<T> : 

  BaseClass, 

  IInterface1, 

  IInterface2 

  where 

  T : CONSTRAINT,

      CONSTRAINT,

      ...

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


查看完整回答
反对 回复 2022-11-13
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信