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

在接口c#8中使用静态、内部和受保护的访问修饰符,c#,c#-8.0,C#,C# 8.0,C#8现在支持接口成员上的访问修饰符,它的用法让我感到困惑。以下面的例子为例 公共接口IFoobar {//这些成员都是有效的 受保护字符串受保护{get;set;} 内部字符串内部{get;set;} 静态字符串static{get;set;} } 公共类Foobar:IFoobar// 我知道使用显式接口实现将实现成员,但对于c#8之前的接口成员,严格来说,这不是唯一的方法。为什么这与新成员不同 。以下是相关文本: 隐式实现非公共接口成员 我们是否允许隐式实现非公共接口成员?如果是,对实现方

C#8现在支持接口成员上的访问修饰符,它的用法让我感到困惑。以下面的例子为例

公共接口IFoobar
{//这些成员都是有效的
受保护字符串受保护{get;set;}
内部字符串内部{get;set;}
静态字符串static{get;set;}
}
公共类Foobar:IFoobar//
我知道使用显式接口实现将实现成员,但对于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;}
}

看起来您需要显式地实现这些成员<代码>字符串IFoobar.Protected{get;set;}
你能把这个例子的来源链接起来吗?@Christopher我自己写下了这个例子,这是标准的,看起来这个决定导致了对access修改的默认接口方法的显式实现要求。他们似乎很清楚任何隐式的东西都有多危险。您可以始终在以后隐式添加。但是,您永远无法删除它。谢谢您的解释。虽然在概念上我还没有学到很多关于为什么会这样的东西,但从技术上来说,你已经回答了我问题的每一部分。干杯。@Mauritsmoyes最后,我认为这主要是为了允许在不破坏所有当前实现者的情况下更改接口。额外的修饰符用于在潜在的接口层次结构上简化这些默认实现的实现。至少,这是我最好的选择。这是一个功能,我只打算使用,如果它是更容易的更可怕的选择。