【问题标题】:Why in C# does one need to mention the access modifier for implementation of an interface property?为什么在 C# 中需要提及访问修饰符来实现接口属性?
【发布时间】:2018-08-21 06:43:28
【问题描述】:

接口和实现接口的类中的方法默认是公共的。他们不需要提到的访问器。

为什么属性,特别是在实现接口的类中,需要提到公共访问修饰符? 无论如何都不允许使用其他修饰符。

【问题讨论】:

  • 谁告诉你方法默认是公共的,在实现接口的类中需要访问说明符。
  • 这不准确。接口中的任何内容都是公共的,即使接口本身是内部的,因此您不能为接口的任何成员设置任何访问修饰符。在实现接口的类中,任何显式实现接口的方法都是公共的,您也不能对其设置任何访问修饰符,但是对于隐式实现接口的任何成员,您必须指定公共访问修饰符。任何其他修饰符都会产生编译错误。
  • 好问题!我有我的假设,您可以在我的回答中读到,但我想知道@EricLippert 对此有何看法。
  • @IpsitGaur:为这个错误道歉。是的方法需要一个访问说明符。只有在显式接口实现的情况下才不需要提及。

标签: c# interface properties access-modifiers


【解决方案1】:

这不准确。
接口中的任何内容都是公共的,即使接口本身是内部的,因此您不能为接口的任何成员设置任何访问修饰符。

在实现接口的类中,显式实现接口的任何成员(属性、方法、事件或索引器)都是公共的,您也不能对其设置任何访问修饰符。 但是任何隐式实现接口的成员都必须指定访问修饰符。

由于接口中的所有内容都是公共的,并且您不能根据访问修饰符重载方法,因此任何其他修饰符都会产生编译错误。

为什么编译器会强制你将隐式接口实现成员声明为公共的?

好吧,我不确定原因,但我认为这是因为类成员的默认访问修饰符是 private,并且允许程序员在不指定 public 访问修饰符的情况下隐式实现接口意味着c# 编译器团队必须投入一些额外的工作来实现这一点,而且(我认为)更重要的是,有可能让任何查看代码的开发人员感到困惑,因为实现是隐式的并且不知道你不知道的接口如果类中的方法是接口的实现还是只是常规方法。

【讨论】:

    【解决方案2】:

    这将违反接口的原则。这样,您可以将接口中声明的方法及其实现隐藏在已实现该接口的 Class 对象中。这是不允许的。

    【讨论】:

      【解决方案3】:

      在 C# 中,接口是为作为第三方提供功能而创建的,因此它始终是公共成员函数。

      虽然类具有访问修饰符,因此它具有私有、内部、受保护、公共。

      还为属性提供访问修饰符有助于使用 setter 使只读。

      【讨论】:

        【解决方案4】:

        参考文档:Access Modifiers (C# Programming Guide)

        在命名空间中直接声明的接口可以声明为 公共或内部,就像类和结构一样,接口 默认为内部访问。接口成员总是公开的 因为接口的目的是让其他类型能够访问 一个类或结构。不能将访问修饰符应用于接口 成员。

        枚举成员始终是公共的,不能有访问修饰符 已申请。

        委托的行为类似于类和结构。默认情况下,他们有 直接在命名空间中声明时的内部访问,并且是私有的 嵌套时访问。

        参考这些:
        Why do interface members have no access modifier?
        Access modifiers on interface members in C#
        I'm confused about default access modifier of C# interface members

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-12
          • 2019-10-28
          • 2011-05-15
          • 2010-11-07
          • 2020-09-19
          • 2011-08-27
          相关资源
          最近更新 更多