实现接口时使用接口定义类型的派生类作为参数为何报CS0535错误
错误原因
CS0535错误的核心是类没有实现接口约定的所有成员,你的代码问题出在方法签名不匹配:
IService接口约定的Do方法参数类型是IService.IRequest,C#要求接口实现的方法签名必须和接口定义完全精确匹配,不允许参数类型自动向下兼容。- 你在
Service类中定义的Do方法参数是Service.Request类型,尽管Request确实实现了IService.IRequest,但它是更具体的派生类型,不符合接口定义的参数类型要求,等于你没有实现接口约定的void Do(IService.IRequest request)方法,所以编译器报错。
修复方案
方案1:直接匹配接口签名
按接口约定的参数类型实现方法,后续如果需要用自定义的Request类型可以在方法内部做类型转换:
public class Service : IService { public class Request : IService.IRequest { } public void Do(IService.IRequest request) { // 如需处理自定义Request的逻辑,可在此处转换 var req = request as Request; if (req != null) { // 自定义逻辑 } } }
方案2:用泛型接口实现强类型约束
如果希望Do方法可以直接用自定义的Request类型,可以把接口改造为泛型版本:
// 改造后的泛型接口 public interface IService<TRequest> where TRequest : IService.IRequest { public interface IRequest { } void Do(TRequest request); } // 实现类指定泛型参数为自定义的Request类型 public class Service : IService<Service.Request> { public class Request : IService.IRequest { } public void Do(Request request) { } }
内容的提问来源于stack exchange,提问作者jangix
相关产品推荐
相关产品推荐

