【问题标题】:Interface method cannot implement another interface接口方法不能实现另一个接口
【发布时间】:2021-11-01 15:28:10
【问题描述】:

我找不到它为什么不起作用。我想做一个简单的接口,其中包含一个实现 IError 接口的通用方法

   public class ErrorHandler<T> : IErrorHandler<ErrorInfo>
  {
    public Task HandleAsync() where T : IError
    {
        //code
    }
  }


  public interface IErrorHandler<T>
  {
    Task HandleAsync() where T : IError;
  }

  public interface IError
  {
    //code
  }

  public class ErrorInfo : IError
  {
    //code
  }

编译错误显示“非泛型声明上不允许使用约束”

【问题讨论】:

  • (顺便说一句,声明类型参数但从不实际使用它是很奇怪的......)
  • 不是那么明显:您的方法根本不是通用的,因此您无法提供 where 约束。但是,您的班级可能会受到约束,因为它通用

标签: c# asp.net-core generics error-handling interface


【解决方案1】:

编译器错误消息说明了一切 - 您已为 T 类型参数添加了一个约束,但您已将其添加到未声明该类型参数的位置。它应该在接口声明上,而不是方法声明上。请注意,您说“包含通用方法” - 它没有。这不是泛型方法,它是泛型类/接口中的非泛型方法。

你的类和接口应该是这样的:

public class ErrorHandler<T> : IErrorHandler<ErrorInfo> where T : IError
{
    public Task HandleAsync() 
    {
        // Code
    }
}

public interface IErrorHandler<T> where T : IError
{
    Task HandleAsync();
}

如果您实际上想要一个泛型方法,它看起来像这样:

public class ErrorHandler : IErrorHandler
{
    public Task HandleAsync<T>() where T : IError
    {
        // Code
    }
}

public interface IErrorHandler
{
    Task HandleAsync<T>() where T : IError;
}

【讨论】:

  • 谢谢。第二个选项不编译'使用泛型类型 IErrorHandler 需要 1 个类型参数'
  • @JUrma:哎呀,实际上忘记将接口更新为非泛型。现在应该可以工作了。但我怀疑你真的想要泛型类型。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 2012-04-30
  • 2020-06-21
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
  • 2022-11-28
相关资源
最近更新 更多