在C#中的接口成员访问修饰符(Access modifiers on interface membe

2019-06-24 20:55发布

我从以下属性得到一个编译错误。
错误是:

“修改器‘公众’并不适用于这个项目”

public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
    get { return properties; }
    set { properties = value; }
}

但如果我删除IWorkItemControl它编译罚款。

为什么会出现这个错误,是什么有/在签名不具有接口名称的区别?

Answer 1:

显式接口实现没有让你指定任何访问修饰符。 当你实现一个接口成员明确(由会员名前指定接口名称),你只能使用该接口访问该成员。 基本上,如果你这样做:

System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
    get { return properties; }
    set { properties = value; }
}

你可以这样做:

MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface

有几个用例EII。 例如,你想提供一个Close你的类释放获得的资源的方法,但你还是要实现IDisposable 。 你可以这样做:

class Test : IDisposable {
    public void Close() {
        // Frees up resources
    }
    void IDisposable.Dispose() {
        Close();
    }
}

这样,类的消费者只能调用Close直接(他们甚至不会看到Dispose在智能感知列表),但你仍然可以使用Test类的地方IDisposable预期(例如,在using语句)。

另一种使用情况为EII为两个接口提供相同名称的接口构件的不同的实施方式:

interface IOne {
   bool Property { get; }
}

interface ITwo {
   string Property { get; }
}

class Test : IOne, ITwo {
   bool IOne.Property { ... }
   string ITwo.Property { ... }
}

正如你看到的,没有EII它甚至可以实现在一个类这个例子中的两个接口(如属性的返回类型只是不同)。 在其他情况下,你可能想有意提供通过不同的接口的类的个人意见不同的行为。



Answer 2:

接口的所有元素都必须是公开的。 毕竟,接口对象的公众视野。

由于属性是一个接口IWorkItemControl的元素,这已经是公开的,你不能指定其访问级别,甚至冗余指定它是公共的。



文章来源: Access modifiers on interface members in C#