一个接口声明可以声明零个或多个成员。接口的成员必须是方法、属性、事件或索引器。接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。
所有接口成员都隐式地具有 public 访问属性。接口成员声明中包含任何修饰符都属于编译时错误。具体来说,不能使用修饰符 abstract、public、protected、internal、private、virtual、override 或 static 来声明接口成员。
在以下示例中:
public delegate void StringListEvent(IStringList sender);
public interface IStringList
{
void Add(string s);
int Count { get; }
event StringListEvent Changed;
string this[int index] { get; set; }
}
声明了一个接口,该接口的成员涵盖了所有可能作为接口成员的种类:方法、属性、事件和索引器。
interface-declaration 创建新的声明空间(第 3.3 节),并且 interface-declaration 直接包含的 interface-member-declarations 将新成员提供给该声明空间。以下规则适用于 interface-member-declaration:
· 方法的名称必须与同一接口中声明的所有属性和事件的名称不同。此外,方法的签名(第 3.6 节)必须不同于在同一接口中声明的所有其他方法的签名,并且在同一接口中声明的两种方法的签名不能只有 ref 和 out 不同。
· 属性或事件的名称必须与同一接口中声明的所有其他成员的名称不同。
· 一个索引器的签名必须区别于在同一接口中声明的其他所有索引器的签名。
准确地说,接口所继承的成员不是该接口的声明空间的一部分。因此,允许接口用与它所继承的成员相同的名称或签名来声明新的成员。发生这种情况时,则称派生的接口成员隐藏了基接口成员。隐藏一个继承的成员不算是错误,但这确实会导致编译器发出警告。为了避免出现上述警告,派生接口成员的声明中必须包含一个 new 修饰符,以指示该派生成员将要隐藏对应的基成员。第 3.7.1.2 节中对该主题进行了进一步讨论。
如果在不隐藏所继承成员的声明中包含 new 修饰符,将对此状况发出警告。通过移除 new 修饰符可取消显示此警告。
请注意,严格来讲,类 object 中的成员不是任何接口的成员(第 13.2 节)。但是,通过在任何接口类型中进行成员查找,可获得类 object 中的成员(第 7.3 节)。