c# - 为什么C#禁止接口(interface)成员的内部访问?

标签 c# interface access-modifiers

C# 故意阻止我将内部访问修饰符放在接口(interface)成员上。我很确定他们本来可以允许这样做,但他们必须付出额外的努力来实现这一限制。

应该有一个充分的理由去花费这样的努力 - 哪一个?

对我来说,在接口(interface)上使用内部访问修饰符来实现“来自外部的可变性预防”会很有用。例如。考虑以下接口(interface):

interface IMessage
{
    ...
    DateTime LastSentTimestamp { get; internal set; }
    ...
}

在内部,在我的消息代理中,我希望能够设置LastSentTimestamp。我的 API 的外部用户不应该能够更改它。当然,我可以放弃接口(interface)并使用类,但是,这消除了接口(interface)的所有优点(例如随时更改实现等)

问题1:我不明白他们为什么限制我。有什么特殊原因吗?

问题2:我正在寻找针对上述特定情况的解决方法。将界面一分为二(IMessageIInternalMessage)看起来很麻烦,希望这不是我唯一的选择......

最佳答案

我猜 C# 设计者所看到的冲突是,您无法使用声明程序集(和友元程序集)之外的内部成员实现接口(interface)。当然,如果外部程序集仅使用该接口(interface),那么这样做仍然有用。另一方面,您可以使用第二个仅限内部的接口(interface)来获得此行为:

public interface IPublic { /* all public members */ }
internal interface IPrivate : IPublic { /* additional members */ }

您自己的类实现IPrivate。外部代码只能使用IPublic

关于c# - 为什么C#禁止接口(interface)成员的内部访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19212621/

相关文章:

scala - 如何将 Scala 中的包设为私有(private)?

c# - 为什么集合初始化会忽略访问修饰符?

c# - 文本框和标签之间的一致空间和对齐方式

c# - 迭代器和枚举器的区别

javascript - 在 TypeScript 中避免接口(interface)的初始 I 不会导致命名冲突吗?

java - 如何实现为对象实例添加值的默认接口(interface)方法

pointers - 类型将接口(interface)指针转换为接口(interface)指针

c# - 使用 sshnet 执行 unix 脚本

c# - 将目录临时添加到 Windows 7 的 DLL 搜索路径

java - Java中 "methods without access control can be declared more private in subclasses"是什么意思?