I';我对C#接口成员的默认访问修饰符感到困惑

I';我对C#接口成员的默认访问修饰符感到困惑,c#,interface,clr,C#,Interface,Clr,接口方法的访问修饰符是什么?它应该是public或protected,因为您在实现它们时可以访问它们(这很有意义)。它也应该是抽象的,因为它们没有实现。但最近我读了一本书,叫做《通过C实现CLR》,关于接口的一章说 CLR要求将接口方法标记为虚拟。如果在源代码中未明确将该方法标记为virtual,编译器将该方法标记为virtual和sealed 当您标记接口成员虚拟时,编译器会抱怨中的访问修饰符无效。我的意思是没有访问修饰符对接口中的任何内容有效,而不是编译器提供给它们的默认修饰符,对吗?有人能

接口
方法的访问修饰符是什么?它应该是
public
protected
,因为您在实现它们时可以访问它们(这很有意义)。它也应该是抽象的,因为它们没有实现。但最近我读了一本书,叫做《通过C实现CLR》,关于接口的一章说

CLR要求将
接口
方法标记为
虚拟
。如果在源代码中未明确将该方法标记为
virtual
,编译器将该方法标记为
virtual
sealed

当您标记
接口
成员
虚拟
时,编译器会抱怨中的访问修饰符无效。我的意思是没有访问修饰符对
接口中的任何内容有效,而不是编译器提供给它们的默认修饰符,对吗?有人能给我讲清楚吗?

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

关于接口成员的实现:

要实现接口成员,的对应成员 实现类必须是公共的、非静态的,并且具有相同的 作为接口成员的名称和签名


因此,您不能使用受保护的接口实现接口成员。

不同意您的评论:

CLR要求将接口方法标记为虚拟。如果在源代码中没有显式地将该方法标记为virtual,编译器会将该方法标记为virtual和sealed

特别是因为你通过C#提到了CLR,我肯定你读错了。圣经是不会错的

编辑:提供更多详细信息

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

我从书中复制了您看到的内容。我怎么会错过这本书呢?这不是他的评论,这是你称之为《圣经》的那本书中的一句话。即使不是,这也不是一个很有帮助的答案。你什么都不解释,你只是。杰弗里·里希特是人类,当然,他可能会犯错误。你们这些人怎么了?我做错什么了吗?你刚才问了一个问题。这本书说的和我所知道的不一样,我感到困惑。如果你能回答我的问题,那就不客气了。如果你不能回答,那你为什么会在这里?CLR的实现细节和C语言的指定行为之间存在差异。这并不奇怪。CLR要求接口方法是虚拟的,但不能在C#中以这种方式声明它们,因为不能在派生类中重写它们。