C#中接口成员的访问修饰符

Access modifiers on interface members in C#

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

"The modifier 'public' is not valid for this item"

1
2
3
4
5
public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
    get { return properties; }
    set { properties = value; }
}

但如果我删除IWorkItemControl,它编译得很好。

为什么会出现此错误?签名中有/没有接口名有什么区别?


显式接口实现不允许您指定任何访问修饰符。显式实现接口成员时(通过在成员名称之前指定接口名称),只能使用该接口访问该成员。基本上,如果你这样做:

1
2
3
4
5
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
    get { return properties; }
    set { properties = value; }
}

你不能这样做:

1
2
3
4
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。你可以这样做:

1
2
3
4
5
6
7
8
class Test : IDisposable {
    public void Close() {
        // Frees up resources
    }
    void IDisposable.Dispose() {
        Close();
    }
}

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

EII的另一个用例是为两个接口提供同名接口成员的不同实现:

1
2
3
4
5
6
7
8
9
10
11
12
interface IOne {
   bool Property { get; }
}

interface ITwo {
   string Property { get; }
}

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

如您所见,如果没有EII,甚至不可能在一个类中实现这个示例的两个接口(因为属性在返回类型上不同)。在其他情况下,您可能希望通过不同的接口为类的单个视图有意提供不同的行为。


接口的所有元素都必须是公共的。毕竟,接口是对象的公共视图。

由于属性是接口iWorkItemControl的元素,因此它已经是公共的,您不能指定其访问级别,甚至可以冗余地指定它是公共的。