实现多个泛型接口——类型错误我正在尝试做这样的事情:publicinterfaceIRepository{TGet(intid);}publicinterfaceIFooBarRepository:IRepository,IRepository{}IFooBarRepositoryrepo=SomeMethodThatGetsTheActualClass();Foofoo=repo.Get(1);我收到一条警告:类型参数“T”与外部类型“IRepository”中的类型参数同名还有一个错误:以下方法或属性调用不明确:“IRepository.Get(int)”和“IRepository”.Get(int)'关于如何使这种模式起作用的任何想法?要调用适当的方法,您需要让编译器以适当的方式考虑表达式:IFooBarRepositoryrepo=SomeMethodThatGetsTheActualClass();IRepositoryfooRepo=回购;foofoo=fooRepo.Get(1);请注意,您可以将其转换为A语句:IFooBarRepositoryrepo=SomeMethodThatGetsTheActualClass();Foofoo=((IRepository)repo).Get(1);......但这对我来说很难看。这涉及调用方法。在一个类中实现这两个接口是下一个障碍......因为它们在参数方面具有相同的签名。您必须明确实现其中至少一个-如果您同时执行这两个操作,可能会减少混淆:}BarIRepository.Get(intid){returnnewBar();编辑:您还需要使用非泛型方法:目前您正在尝试重新声明IRepository.Get的类型参数T您只想使用IRepository的现有类型参数。不幸的是,你不能。这不是泛型设计为在C#中工作的方式。如果您使用此模式,您将被迫始终强制转换以消除您希望调用Get()的接口版本的歧义:IFooBarRepositoryrepo=SomeMethodThatGetsTheActualClass();Foofoo=((IRepository)repo).Get(1);这可能不是您想要的。当然,您可以在IFooBarRepository的实现中实现一个返回正确类型的代理方法……但同样,这可能不是您想要的。但是,您可以在IFooBarRepository上拥有改进语法的属性:interfaceIFooBarRepository:IRepository,IRepository{IRepositoryFooGetter{get;}IRepositoryBarGetter{得到;现在你可以写:IFooBarRepositoryrepo=SomeMethodThatGetsTheActualClass();Foofoo=repo.FooGetter.Get(1);Barbar=repo.BarGetter.Get(2);通常,最好避免不接受表单参数参数作为类型参数类型的泛型方法。在您的情况下,您正在尝试将存储库的语义直接编码到类型系统中。您最好将这种可重复性拆分为表示存储库行为的类型和表示获取对象行为的单独类型。您不需要在已经在接口上声明的方法声明中重复T:publicinterfaceIRepository{TGet(intid);另请注意,您需要显式实现IFooBarRepository接口,因为只有Get方法的返回类型不同,这是不可能的。而不是:Foofoo=repo.Get(1);使用Foofoo=((IRepository)repo).Get(1);哪种方式会破坏使用泛型来避免转换的整体感觉,但遗憾的是,如果你不添加到编译器给出更多提示,那么你正在做的事情是不可能的。使用显式实现。要指定哪个Get,首先转换为适当的接口。以上就是《C#学习教程:实现多个通用接口-类型错误共享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
