我从以下属性得到一个编译错误。
错误是:
“修改器‘公众’并不适用于这个项目”
public System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
但如果我删除IWorkItemControl
它编译罚款。
为什么会出现这个错误,是什么有/在签名不具有接口名称的区别?
显式接口实现没有让你指定任何访问修饰符。 当你实现一个接口成员明确(由会员名前指定接口名称),你只能使用该接口访问该成员。 基本上,如果你这样做:
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它甚至可以实现在一个类这个例子中的两个接口(如属性的返回类型只是不同)。 在其他情况下,你可能想有意提供通过不同的接口的类的个人意见不同的行为。
接口的所有元素都必须是公开的。 毕竟,接口为对象的公众视野。
由于属性是一个接口IWorkItemControl的元素,这已经是公开的,你不能指定其访问级别,甚至冗余指定它是公共的。