Ответ 1
Это известно как реализация явного интерфейса. Элемент интерфейса не отображается как открытый элемент этого типа, но он доступен путем литья ссылки на тип интерфейса.
Это можно сделать в С# следующим образом:
interface I
{
void M();
}
class C : I
{
public int P { get; set; }
void I.M() { Console.WriteLine("M!"); }
}
Затем вы можете использовать эти типы следующим образом:
C obj = new C();
obj.P = 3;
((I)obj).M();
Но это не скомпилируется:
obj.M();
Как отмечает JeffN825, одной из причин для экспликации членов интерфейса является то, что они не поддерживаются типом. Например, Add
выдает исключение (соответствующее обсуждение). Еще одна причина для экспликации члена заключается в том, что он дублирует другой открытый член с другим именем. То, что причина Count
реализована явно; соответствующий публичный член Length.
Наконец, некоторые члены реализуются неявно, а именно, индексатор. Обе эти линии работают (при условии, что arr
представляет собой массив int
):
arr[0] = 8;
((IList<int>)arr)[0] = 8;