当前位置: 首页 > 知识库问答 >
问题:

C#默认接口实现-不能重写

姚臻
2023-03-14

我遵循本指南https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/default-interface-methods使用默认接口实现功能。我复制了一段在接口ia中定义默认实现的代码,然后在接口ib中重写它:

interface I0
{
    void M() { Console.WriteLine("I0"); }
}

interface I1 : I0
{
    override void M() { Console.WriteLine("I1"); }
}

但它给出了一个错误CS0106修饰符“override”对此项无效和一个警告CS0108“i1.m()”隐藏继承的成员“i0.m()”。如果要隐藏,请使用new关键字targetframework设置为net5.0langversion最新。为什么即使在官方文件中有描述也不起作用?

共有2个答案

苏建安
2023-03-14

在文本中,它说“不允许隐式重写”。

令人困惑的是,在使用隐式方法时,后面的ic接口并不重复该语句,使其看起来像隐式方法是有效的。而ic似乎是您复制的接口。

凌嘉志
2023-03-14

从提到的文件来看:

允许重写声明显式重写特定的基接口方法,方法是使用接口名称限定声明(在这种情况下不允许访问修饰符)。不允许隐式重写。

所以你得用这个:

interface I0
{
    void M() { Console.WriteLine("I0"); }
}

interface I1 : I0
{
    override void I0.M() { Console.WriteLine("I1"); }
}
 类似资料:
  • 本文向大家介绍Kotlin 与默认实现接口,包括了Kotlin 与默认实现接口的使用技巧和注意事项,需要的朋友参考一下 示例 Kotlin中的接口可以具有功能的默认实现: 实现此类接口的类将能够使用这些功能而无需重新实现 物产 默认实现也适用于属性获取器和设置器: 接口访问器实现不能使用后备字段 多种实现 当多个接口实现相同的功能,或者所有接口都定义一个或多个实现时,派生类需要手动解析正确的调用

  • 下面是一个简单的例子,展示了我的问题: 在中,我提供了方法和的实现,这是来自的唯一抽象方法。但是,当我编译时,我仍然会遇到以下错误: 类型MyWork必须实现继承的抽象方法AbstractCollection.size() 或者 我的任务。java:3:错误:MyTask不是抽象的,并且不重写AbstractList中的抽象方法get(int) (取决于编译器)。当然,我使用的是java 8。 所

  • 我声明了一个该类型的变量,并初始化了所有属性 然后我稍后在一个init函数中为它们赋值实数 但我不喜欢在声明对象时为每个属性指定一组缺省空值,因为它们稍后将被设置为实值。我能告诉接口将我不提供的属性默认为null吗?什么会让我这么做: 而不会得到编译器错误。现在它告诉我 TS2322:类型“{}”不能分配给类型“ix”。类型“{}”中缺少属性“b”。

  • 我遇到了这个问题: 下面的输出是什么? 我的想法是: 我的第一直觉告诉我-i=new I(){}?因此,我们不能实例化接口-问题1。 那么我认为公共默认字符串是toString()?重写对象类方法?听起来不太好-问题2 可能的答案: a)10I b) 15I c)由于第11行编译失败 d)由于第15行编译失败 e)由于多个错误导致编译失败 解释完我的想法后,我选择了错误的答案。正确答案是D,我也答

  • 本文向大家介绍C#结构实现接口,包括了C#结构实现接口的使用技巧和注意事项,需要的朋友参考一下 示例            

  • Iam获得以下错误:-检查了lib文件夹,它是spring-beans我使用了以下名称空间:-http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/