微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么不能隐式实现非公共接口成员?

如何解决为什么不能隐式实现非公共接口成员?

界面:

interface IMyInterface{
  internal int Property {get; set;}
}

班级:

public class MyClass: IMyInterface{
  internal int Property {get; set;}
}

结果: CS8704 错误:MyClass 未实现接口成员 Property。get MyClass 无法隐式实现非公共成员。

为什么我必须显式实现接口?

解决方法

“为什么是这样的语言”的简单答案是“因为这是语言设计者指定的方式”。

那么,他们为什么要这样设计呢?我发现的一些官方注释是these。似乎主要问题是实现者必须拥有什么样的访问权限:

我们是否允许隐式实现非公共接口成员?如果是这样,对实现方法的可访问性有什么要求?一些选项:

  • 必须公开
  • 必须具有完全相同的可访问性
  • 必须至少具有可访问性

他们决定:

现在,我们只是不允许它。只有公共接口成员可以隐式实现(并且只能由公共成员实现)。

“暂时”从未改变,因此从 C# 8 开始,接口可以具有非公共虚拟成员,但类只能显式实现它们。

我可以推测他们可能决定反对这样的隐式覆盖的几个原因:

  • 接口中的非公共虚拟方法可能被认为是一个“罕见”的特性(毕竟,接口不应该记录类的公共行为吗?),不值得在以下方面投入大量资源隐式覆盖的语义。
  • 与类到类继承中的方法覆盖不同,实现接口方法的类方法不使用 override 关键字。看到受保护的和/或内部方法而没有意识到它正在履行接口合同可能会被认为是混乱的。 (公共方法可能被认为不受此问题的影响,因为它们一直是这样工作的,而且公共方法无论如何都是类公共契约的一部分,因此修改/删除它们已经导致读者考虑代码的其他部分这取决于它。)
  • 接口只能显式覆盖其他接口方法,这可能也是因为允许接口到接口的隐式实现对于编译器和工具团队来说成本太高,而对 C# 用户来说太混乱了。 (特别是因为接口到接口的继承是多重继承。)由于 C# 8 中普遍引入了 this 和非公共接口方法,因此使这两个功能在语法上匹配可能是有意义的。

另见notes on this question in the default interface method proposal

,

接口成员没有像公共或内部这样的范围。你这里有一个 default interface implementation

所以你需要移除界面上的作用域:

interface IMyInterface{
    int Property {get; set;}
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。