C#接口方法泛型约束报错:不允许在非泛型声明上使用约束
编译错误原因
你遇到的Constraints are not allowed on non-generic declarations错误,核心是泛型约束的生效位置写错了:
你当前代码中的HandleAsync本身没有声明泛型参数,属于非泛型方法,泛型参数T是属于IErrorHandler<T>接口的,不能在非泛型方法上添加泛型约束。同时你的实现类ErrorHandler<T>继承接口时写死了IErrorHandler<ErrorInfo>,导致类的泛型参数T和接口的泛型参数完全没有关联。
解决方案
按照你的需求「定义包含泛型方法的简单接口,方法的泛型参数实现IError接口」,正确实现代码如下:
public interface IError { // 业务代码 } public class ErrorInfo : IError { // 业务代码 } // 接口不需要定义为泛型,泛型参数直接声明在方法上 public interface IErrorHandler { // 方法显式声明泛型参数<T>,约束加在方法声明后 Task HandleAsync<T>() where T : IError; } // 实现类 public class ErrorHandler : IErrorHandler { public Task HandleAsync<T>() where T : IError { // 业务代码 return Task.CompletedTask; } }
如果你需要的是泛型接口(整个接口的所有逻辑共用同一个泛型参数),可以用如下实现:
public interface IError { // 业务代码 } public class ErrorInfo : IError { // 业务代码 } // 泛型约束直接加在接口的泛型参数声明之后 public interface IErrorHandler<T> where T : IError { Task HandleAsync(); } // 泛型实现类,同步泛型约束 public class ErrorHandler<T> : IErrorHandler<T> where T : IError { public Task HandleAsync() { // 业务代码 return Task.CompletedTask; } } // 固定使用ErrorInfo的非泛型实现 public class FixedErrorHandler : IErrorHandler<ErrorInfo> { public Task HandleAsync() { // 业务代码 return Task.CompletedTask; } }
内容的提问来源于stack exchange,提问作者user16821603
相关产品推荐
相关产品推荐

