【问题标题】:I'm confused about default access modifier of C# interface members [duplicate]我对 C# 接口成员的默认访问修饰符感到困惑 [重复]
【发布时间】:2013-07-09 11:02:22
【问题描述】:

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

CLR 要求将 interface 方法标记为 virtual。如果您没有在源代码中将方法显式标记为virtual,编译器会将方法标记为virtualsealed

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

【问题讨论】:

  • CLR的实现细节和C#语言的指定行为是有区别的。并不那么令人惊讶。 CLR 要求接口方法是虚拟的,但您不能在 C# 中以这种方式声明它们,因为您不能在派生类中覆盖它们。

标签: c# interface clr


【解决方案1】:

不同意你的评论:

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

特别是因为您提到 CLR 通过 C#,我确定您有误读。圣经不会错的。

编辑:提供更多细节。

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

【讨论】:

  • 我复制了你从书中看到的内容。我怎么会漏读呢?
  • 这不是他的评论,这是你称之为“圣经”的书中的一句话。即使不是,这也不是一个很有帮助的答案。你什么都不解释,你只是appeal to authority。 Jeffrey Richter 是人类,当然,他可能会犯错。
  • 你们怎么了?我做错什么了吗?你刚刚问了一个问题。这本书说的与我所知道的不同,我很困惑。如果你能回答我的问题,那么欢迎你,如果你不能,那你为什么在这里?
【解决方案2】:

Interfaces (C# Programming Guide)

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

关于接口成员的实现:

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

所以你不能使用protected one 来实现接口成员。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2018-06-13
    • 2015-11-07
    • 1970-01-01
    • 2011-04-10
    • 2014-04-12
    相关资源
    最近更新 更多