2

C# 故意阻止我将内部访问修饰符放在接口成员上。我很确定当他们本可以允许的时候,他们必须付出额外的努力来实施这个限制。

应该有充分的理由花费这些努力——哪一个?

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

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

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

Q1:我不明白他们为什么限制我。有什么特别的原因吗?

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

4

2 回答 2

5

我猜 C# 设计者看到的冲突是你不能用internal声明程序集(和朋友程序集)之外的成员实现接口。当然,如果外部程序集只使用接口,这样做仍然很有用。另一方面,您可以使用 second internal-only 接口获得此行为:

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

而你自己的类实现IPrivate. 外部代码只能使用IPublic.

于 2013-10-06T19:05:42.493 回答
1

应该具有访问修饰符的不是您的接口的成员,而是整个接口,以便具有一致的可访问性和您的类。接口仅在由类实现时使用。接口表达了必须由实现者实现的契约。如果一个类位于接口程序集之外,它将如何实现您的内部成员?因此它无法实现合同,但其中的类必须能够......这在逻辑上是不一致的。

于 2013-10-06T18:54:54.797 回答