在我的应用程序中,我使用不同的web api来获取汽车信息。对于我已经实现了ICarService的服务。由于所有这些Api都返回了一些不同的汽车数据,我已经实现了ICar界面,因此每个服务都可以返回自己的汽车类型,但在我的应用程序中我可以使用“通用”ICar。
这是我的实施:
// Car Model
public interface ICar
{
string Color { get; }
}
public class CarApiA : ICar
{
public int car_color { get; set; }
public Color
{
get { return this.car_color; }
}
}
// Service
public interface ICarService
{
Task<List<ICar>> GetCarsAsync(string search);
}
public class CarApiAService : ICarService
{
public async Task<List<CarApiA>> GetCarsAsync(string search)
{
HttpClient client = new HttpClient();
var response = await client.GetAsync(url);
string content = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<List<CarApiA>>(content);
}
}
现在我收到错误消息“'CarApiAService'没有实现接口成员'ICarService.GetCarsAsync(string)'。'CarApiAService.GetCarsAsync(string)'无法实现'ICarService.GetCarsAsync(string)',因为它没有匹配的返回类型'System.Threading.Tasks.Task&gt;'。“
我如何使用界面返回界面?如果我的实施想法完全错误,请指导我正确指导。
答案 0 :(得分:3)
考虑使用IEnumerable
代替IList
。这允许您使用协变泛型类型:
public async Task<IEnumerable<ICar>> GetCarsAsync(string search)
{
// ...
return JsonConvert.DeserializeObject<List<CarApiA>>(content);
}
(当然界面也必须更新......)
public interface ICarService
{
Task<IEnumerable<ICar>> GetCarsAsync(string search);
}
如果您想知道与泛型类型的协方差,请解释一下:
List<T>
)out
(即只读),则接口只能是协变的。这就是为什么IEnumerable<out T>
是协变的,但IList<T>
不是另请参阅Jon Skeet的回答here和Eric Lippert's blog。