为什么在C#中实现接口属性时需要指定访问修饰符?

3

接口中的方法和实现接口的类中的方法默认为public。它们不需要访问器。

为什么在实现接口的类中,属性需要显式声明public访问修饰符?其他修饰符也不允许。


谁告诉你方法默认是公共的?在实现接口的类中,它们需要访问修饰符。 - Ipsit Gaur
1
这不准确。接口中的任何内容都是公共的,即使接口本身是内部的,因此您无法为接口的任何成员设置任何访问修饰符。 在实现接口的类中,显式实现接口的任何方法都是公共的,您也无法为其设置任何访问修饰符,但对于隐式实现接口的任何成员,您必须指定公共访问修饰符。任何其他修饰符都会生成编译错误。 - Zohar Peled
好问题!如你在我的回答中所看到的,我有我的假设,但是我很想知道@EricLippert会对此有什么看法。 - Zohar Peled
@IpsitGaur:对于那个错误我很抱歉。是的,方法需要一个访问修饰符。只有在显式接口实现的情况下,它们才不需要被提及。 - Shivku
4个回答

5

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

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

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

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

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


1

参考文档:访问修饰符 (C# 编程指南)

在命名空间中直接声明的接口可以声明为 public 或 internal,与类和结构体一样,默认情况下,接口的访问级别为 internal。接口成员始终为 public,因为接口的目的是使其他类型能够访问类或结构体。不能将访问修饰符应用于接口成员。

枚举成员始终为 public,并且不能应用任何访问修饰符。

委托行为类似于类和结构体。默认情况下,在命名空间中直接声明时,它们具有 internal 访问权限,在嵌套时具有 private 访问权限。

请参考以下内容:
为什么接口成员没有访问修饰符?
C#中接口成员的访问修饰符
我对C#接口成员的默认访问修饰符感到困惑


0
在C#中,接口是为了给第三方提供功能而创建的,因此它总是公共成员函数。
而类具有访问修饰符,因此它可以是private、internal、protected、public。
另外,为属性提供访问修饰符有助于使用setter使其只读。

0

这将违反接口的原则。这样,您可以隐藏在接口中声明的方法及其实现,使其不被实现接口的类对象所访问。这是不允许的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接