静态抽象和虚拟接口成员错误和警告

对于接口中静态抽象或虚拟成员的无效声明,编译器会生成以下错误:

  • CS8920:接口不能用作类型参数。静态成员在接口中没有最具体的实现。
  • CS8921:一元运算符的参数必须是包含类型或其限制为该类型的类型参数。
  • CS8922:++-- 运算符的参数必须是包含类型或其限制为该类型的类型参数。
  • CS8923:++-- 运算符的返回类型必须与参数类型匹配,或者必须从参数类型派生,或者必须是包含类型的限制为该类型的类型参数,除非该参数类型是不同的类型参数。
  • CS8924:二元运算符的参数之一必须是包含类型或其限制为该类型的类型参数
  • CS8925:重载移位运算符的第一个操作数的类型必须与包含类型或其限制为该类型的类型参数相同
  • CS8926:只能在类型参数上访问静态虚拟或抽象接口成员。
  • CS8928:类型不实现静态接口成员。该方法无法实现接口成员,因为它不是静态的。
  • CS8930:用户定义的运算符的显式实现必须声明为静态
  • CS8931:接口中用户定义的转换必须转换为或转换自封闭类型上限制为封闭类型的类型参数
  • CS8932:“UnmanagedCallersOnly”方法无法实现类型中的接口成员

这些错误发生在代码中的三个位置:

接口声明错误

声明具有 static abstractstatic virtual 成员的接口时,可能会出现以下错误:

  • CS8921:一元运算符的参数必须是包含类型或其限制为该类型的类型参数。
  • CS8922:++-- 运算符的参数必须是包含类型或其限制为该类型的类型参数。
  • CS8923:++-- 运算符的返回类型必须与参数类型匹配,或者必须从参数类型派生,或者必须是包含类型的限制为该类型的类型参数,除非该参数类型是不同的类型参数。
  • CS8924:二元运算符的参数之一必须是包含类型或其限制为该类型的类型参数
  • CS8925:重载移位运算符的第一个操作数的类型必须与包含类型或其限制为该类型的类型参数相同
  • CS8931:接口中用户定义的转换必须转换为或转换自封闭类型上限制为封闭类型的类型参数

所有这些规则都是声明重载运算符的规则的扩展。 区别在于,参数可以是接口类型,也可以是接口的类型参数(如果该类型参数限制为实现其类型的接口)。 对于二元运算符,只有一个参数必须满足此规则。

例如,INumber<T> 可以声明 T operator++(T),因为 T 限制为实现 INumber<T>

若要修复这些错误,请确保接口中定义的任何运算符的参数都遵循这些规则。 可以在有关接口中的静态抽象成员的语言参考文章或探索静态抽象接口成员的教程中了解更多信息。

实现接口声明的类型中出现错误

定义使用 static abstractstatic virtual 方法实现接口的类型时,可能会出现以下错误:

  • CS8928:类型不实现静态接口成员。该方法无法实现接口成员,因为它不是静态的。
  • CS8930:用户定义的运算符的显式实现必须声明为静态
  • CS8932:“UnmanagedCallersOnly”方法无法实现类型中的接口成员

这些错误都表明错误地声明了实现静态抽象接口成员的方法。 这些成员必须声明为 static;它们不能是实例成员。 实现接口成员的方法不能应用 System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute 属性。

调用静态抽象接口成员时出错

尝试调用定义为某个接口的成员 static abstractstatic virtual 接时,可能会出现以下错误:

  • CS8920:接口不能用作类型参数。静态成员在接口中没有最具体的实现。
  • CS8926:只能在类型参数上访问静态虚拟或抽象接口成员。

对声明为 static abstractstatic virtual 的接口成员的调用必须在编译时解析。 它们必须解析为在实现该接口的类型中定义的静态成员。 这意味着必须使用实现该接口的具体类型或限制为实现该接口的类型参数来访问这些成员。 要修复这些错误,请更改用于访问静态成员的类型。