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; } } |
但如果我删除
为什么会出现此错误?签名中有/没有接口名有什么区别?
显式接口实现不允许您指定任何访问修饰符。显式实现接口成员时(通过在成员名称之前指定接口名称),只能使用该接口访问该成员。基本上,如果你这样做:
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有几个用例。例如,您希望为类提供一个
1 2 3 4 5 6 7 8 | class Test : IDisposable { public void Close() { // Frees up resources } void IDisposable.Dispose() { Close(); } } |
这样,类的消费者只能直接调用
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的元素,因此它已经是公共的,您不能指定其访问级别,甚至可以冗余地指定它是公共的。