16

我从以下属性中收到编译错误。
错误是:

“修饰符‘public’对此项目无效”

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

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

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

4

2 回答 2

41

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

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在 Intellisense 列表中看到),但您仍然可以在任何预期的地方使用Test该类(例如在语句中)。IDisposableusing

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

interface IOne {
   bool Property { get; }
}

interface ITwo {
   string Property { get; }
}

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

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

于 2009-07-03T05:01:17.800 回答
0

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

由于Properties是接口IWorkItemControl的一个元素,它已经是公共的,您不能指定它的访问级别,即使是冗余地指定它是公共的。

于 2009-07-03T05:28:03.017 回答