Это называется explicitly implementing an interface. Вы можете сделать элемент невидимым извне, если ссылка на объект не преобразуется в тип интерфейса.
В контексте Collection<T>
, реализующего ICollection
, рассматриваемый интерфейс определяет устаревшие методы, существовавшие до того, как дженерики были введены в C#. Можно сказать, что это «старый уродливый» способ управления коллекциями.
Разработчики решили скрыть эти уродливые методы, сохраняя при этом свою функциональность вызывающему.
var x = new Collection<int>();
object syncRoot = x.SyncRoot; //CS1061: Collection<int> does not contain a ....
ICollection collection = x;
syncRoot = collection.SyncRoot; //ok
Другой сценарий - это конфликт, обычно из-за внешних интерфейсов, которые плохо разработаны и не могут быть изменены. Пример:
interface IFile
{
void Save();
}
interface IDatabaseRecord
{
void Save();
}
class Customer : IFile, IDatabaseRecord
{
public void Save()
{
//what to do here?
}
}
Это может быть преодолен путем внедрения метода в явном виде:
class Customer : IFile, IDatabaseRecord
{
void IFile.Save() { }
void IDatabaseRecord.Save() { }
}
Обратите внимание, что это почти всегда код запах - это может запутать абонент в заблуждении метода нет, или вызвав неправильную реализацию (что вызвало этот вопрос в первую очередь).
Google ** Явная реализация элементов интерфейса ** – chomba
Почему вы говорите, что свойства не реализованы? Я вижу их там http://referencesource.microsoft.com/#mscorlib/system/collections/objectmodel/collection.cs,281923b8611114ec свойства Запрос ICollection - это Count, SyncRoot и IsSynchronized, все они включены –
Какие два свойства вы используете мысли не реализованы? – hatchet