C#8现在支持接口成员上的访问修饰符,它的用法让我很困惑
public interface IFoobar
{ // these members are all valid
protected string Protected { get; set; }
internal string Internal { get; set; }
static string Static { get; set; }
}
public class Foobar : IFoobar // <-- error, Internal and Protected members not implemented
{
protected string Protected { get; set; }
internal string Internal { get; set; }
static string Static { get; set; } // only this one implements IFoobar
}
我的期望是上面的Foobar
将完全实现IFoobar
。然而,这只是Static
的情况,其他情况则不然。
有人能吗
- 解释为什么它们的行为不同(也不同于c#8之前的接口成员(
- 给我一个这样的界面中三个修饰符的用例
感谢
[编辑]
我知道使用显式接口实现会实现成员,但对于c#8之前的接口成员来说,这并不是唯一的方法。为什么新成员的情况有所不同?
我知道使用显式接口实现会实现成员,但对于c#8之前的接口成员来说,这并不是唯一的方法。为什么新成员的情况有所不同?
这似乎是故意的。以下是相关文本:
隐含实现非公共接口成员
我们是否允许隐式实现非公共接口成员?如果是,实现方法的可访问性需要什么?一些选项:
- 必须是公共的
- 必须具有完全相同的可访问性
- 必须至少可访问
结论
现在,我们不允许这样做。只有公共接口成员才能隐式实现(并且只能由公共成员实现(。我们可以一边思考一边放松。
显然,带有访问修饰符的接口方法不会像以前版本的接口成员那样完全遵循相同的规则,因为这些方法只能是公共的。
至于为什么会这样,这是设计师的问题。LDM的措辞也没有让人觉得这是板上钉钉的。因此,可能隐式实现的访问修改成员将来将被允许。
目前,实现这个接口的方法是显式地这样做,就像这样:
public interface IFoobar
{ // these members are all valid
protected string Protected { get; set; }
internal string Internal { get; set; }
static string Static { get; set; }
}
public class Foobar : IFoobar
{
string IFoobar.Protected {get;set;}
string IFoobar.Internal {get;set;}
}