C#接口成员的默认访问修饰符让我感到困惑。

5
接口方法的访问修饰符是什么?应该是公共或受保护的,因为在实现它们时可以访问它们(这很有意义)。它还应该是抽象的,因为它们没有实现。但最近我读了一本名为CLR Via C#的书,其中关于接口的章节如下:

CLR要求将接口方法标记为虚拟的。如果您在源代码中没有明确将该方法标记为虚拟的,则编译器会将该方法标记为虚拟的和密封的。

当您将接口成员标记为虚拟时,编译器会抱怨访问修饰符无效。我的意思是除了编译器赋予给它们的默认值之外,在接口中不需要任何访问修饰符才是有效的,有人能为我澄清一下吗?

1
CLR 的实现细节和 C# 语言规定的行为有所不同,这并不奇怪。CLR 要求接口方法是虚拟的,但在 C# 中你并不需要声明它们为虚拟方法,因为你不能在派生类中覆盖它们。 - Cody Gray
2个回答

9

接口(C# 编程指南)

接口可以包含方法、属性、事件、索引器或这四种成员类型的任意组合。有关示例的链接,请参见相关部分。接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型。接口成员自动为 public,且它们不能包含任何访问修饰符。 成员也不能是静态的。

接口成员的实现:

要实现接口成员,实现类的相应成员必须是 public、非静态的,并与接口成员具有相同的名称和签名。

因此,无法使用 protected 实现接口成员。


0

不同意您的评论:

CLR要求接口方法标记为虚拟的。如果您在源代码中没有明确将方法标记为虚拟的,编译器会将该方法标记为虚拟和密封。

特别是因为您提到了《CLR Via C#》,我确定您已经误读了。圣经不可能错。

编辑:提供更多细节。

正如其他人建议的那样,您不能在接口成员中具有访问修饰符(或虚拟化)。 默认情况下(并且根据定义),接口内部的所有成员都是公共和抽象的。


我把你看到的东西从书上复制过来了,我怎么可能读错呢? - Dimitri
3
这不是“他”的评论,而是你所称的“圣经”书中的引用。即使不是这样,这也不是一个非常有帮助的回答。你没有解释任何内容,只是倚仗权威。杰弗里·里希特也是人,他可能犯了错误。 - Cody Gray
你们这些人怎么了?我做错了什么吗?我只是问了一个问题。书上说的和我知道的不一样,让我感到困惑。如果你能回答我的问题,那么欢迎你;如果你不能,那么你来这里干嘛? - Dimitri

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