在接口C#8中使用静态,内部和受保护的访问修饰符

时间:2019-11-06 16:33:14

标签: c# c#-8.0

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之前的接口成员来说,这并不是严格的唯一方法。为什么新成员会有所不同?

1 个答案:

答案 0 :(得分:5)

  

我知道使用显式接口实现将实现成员,但是对于c#8之前的接口成员来说,这并不是严格的唯一方法。为什么新成员会有所不同?

It appears this is by design。这是相关的文本:

  

隐式实现非公共接口成员

     

是否允许隐式实现非公共接口成员?如果是这样,对实现方法的可访问性有何要求?一些选项:

     
      
  • 必须公开
  •   
  • 可访问性必须完全相同
  •   
  • 必须至少具有可访问性
  •   
     

结论

     

现在,让我们简单地不允许它。只能隐式实现公共接口成员(并且只能由公共成员实现)。我们可以通过思考来放松自己。

很显然,具有访问修饰符的接口方法将不能完全按照与以前版本的接口成员相同的规则来播放,因为它们只能是公共的。

至于为什么采用这种方式,这是设计师的一个问题。 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;}
}