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

时间:2013-07-11 08:43:29

标签: c# interface clr

interface方法的访问修饰符是什么?它应该是publicprotected,因为您在实施它们时可以访问它们(这是有道理的)。它也应该是abstract,因为它们没有实现。但是最近我一直在读一本名为 CLR Via C#的书,关于接口的章节说明如下

  

CLR要求interface方法标记为virtual。如果未在源代码中将方法明确标记为virtual,则编译器会将方法标记为virtualsealed

当您标记interface成员virtual编译器时,抱怨访问修饰符无效。我的意思是没有访问修饰符对interface中的任何内容有效,而不是编译器给它们的默认值?有人能说清楚吗?

2 个答案:

答案 0 :(得分:8)

Interfaces (C# Programming Guide)

  

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

关于界面成员的实施:

  

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

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

答案 1 :(得分:0)

不同意你的评论:

  

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

因为你提到CLR通过C#,我确信你读错了。圣经不可错。

编辑:提供更多详细信息。

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