Tengo una clase que implementa una interfaz y un legado de otra clase.
No sé por qué mi código es malo.
El error que me sale es:
CS0738 'SizeTypeService' does not implement interface member 'IGenericService<ItemType>.GetAll()'. 'GenericService<SizeType>.GetAll()' cannot implement 'IGenericService<ItemType>.GetAll()' because it does not have the matching return type of 'Task<List<ItemType>>'.Creo que mi interfaz y mi clase están bien. No sé por qué VS arroja un error.
public interface IGenericService<TEntity> where TEntity : class { Task<List<TEntity>> GetAll(); Task<TEntity> GetById(int id); Task<TEntity> Insert(TEntity entity); Task<TEntity> Update(TEntity entity); Task Delete(int id); } public class GenericService<TEntity> : IGenericService<TEntity> where TEntity : class { private IGenericRepository<TEntity> genericRepository; public GenericService(IGenericRepository<TEntity> genericRepository) { this.genericRepository = genericRepository; } public async Task Delete(int id) { await genericRepository.Delete(id); } public async Task<List<TEntity>> GetAll() { return await genericRepository.GetAll(); } public async Task<TEntity> GetById(int id) { return await genericRepository.GetById(id); } public async Task<TEntity> Insert(TEntity entity) { return await genericRepository.Insert(entity); } public async Task<TEntity> Update(TEntity entity) { return await genericRepository.Update(entity); } } public interface ISizeTypeService : IGenericService<ItemType> { Task<List<SizeType>> GetAllSizeTypeActives(int id); Task LogicDelete(int id); } public class SizeTypeService : GenericService<SizeType>, ISizeTypeService { private ISizeTypeRepository sizeTypeRepository; public SizeTypeService(ISizeTypeRepository sizeTypeRepository) : base(sizeTypeRepository) { this.sizeTypeRepository = sizeTypeRepository; } public Task<List<SizeType>> GetAllSizeTypeActives(int id) { return sizeTypeRepository.GetAllSizeTypeActives(id); } public Task LogicDelete(int id) { return sizeTypeRepository.LogicDelete(id); } }Ha definido su ServiceTypeClass como
public class SizeTypeService : GenericService<SizeType>, ISizeTypeService { ... } Entonces le está diciendo al compilador que ServiceTypeService usa la clase base GenericService con TEntity definida como SizeType . PERO, la interfaz ISizeTypeService de la que también se deriva le dice al compilador que esta clase también implementa la interfaz IGenericService donde TEntity es una clase ItemType . Pero en ninguna parte del código hay una clase que implemente el método GenericService<ItemType>.GetAll() .
Entonces, el error dice "oye, encontré el método que coincide con GenericService<SizeType>.GetAll() - donde TEntity es SizeType , pero no puedo encontrar uno que coincida con IGenericService<ItemType>.GetAll() "
Para solucionarlo, debe cambiar la definición de ISizeTypeService para usar la misma clase que GenericService para TEntity
p.ej
public interface ISizeTypeService : IGenericService<SizeType> { ... } NOTA: El parámetro genérico ahora es SizeType , que coincide con la clase base GenericService<SizeType> de la que deriva SizeTypeService .
Simplemente Ged explicó claramente. Como código en su ISizeTypeService
public interface ISizeTypeService: IGenericService<ItemType> { }Porque obtiene Task<List> IGenericRepository.GetAll() en GenericService. Entonces
También recibí un error similar, luego agregué el siguiente código en SizeTypeService.cs y el error desapareció
Task<List<ItemType>> IGenericService<ItemType>.GetAll() { throw new NotImplementedException(); }