Возвращаясь на С# через несколько лет, я немного ржавый. Пришел через этот (упрощенный) код, и он оставил мою голову царапин.
Почему вы должны явно реализовать свойство IDataItem.Children? Не удовлетворяет ли нормальное положение Children? В конце концов, свойство используется непосредственно для его удовлетворения. Почему это не подразумевается?
public interface IDataItem {
IEnumerable<string> Children { get; }
}
public class DataItem : IDataItem {
public Collection<string> Children { get; } = new Collection<string>();
// Why doesn't 'Children' above implement this automatically?!
// After all it used directly to satisfy the requirement!
IEnumerable<string> IDataItem.Children => Children;
}
Согласно источнику С#, здесь определение Collection<T>:
[System.Runtime.InteropServices.ComVisible(false)]
public class Collection<T> :
System.Collections.Generic.ICollection<T>,
System.Collections.Generic.IEnumerable<T>, <-- Right Here
System.Collections.Generic.IList<T>,
System.Collections.Generic.IReadOnlyCollection<T>,
System.Collections.Generic.IReadOnlyList<T>,
System.Collections.IList
Как вы можете видеть, он явно реализует IEnumerable<T> и из моего понимания, если "X" реализует "Y", тогда "X" является "Y", поэтому Collection<String> является IEnumerable<String> поэтому я не знаю, почему это не удовлетворено.