为什么.Net FCL同时在List <t>类中实现泛型和非泛型接口IList和IList <t>?</t> </t>

时间:2014-09-26 11:14:15

标签: c# .net

List在.NET中以下列方式实现 我很惊讶为什么他们同时在课堂上实现了泛型和非泛型接口。

[Serializable]
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>,
IList, ICollection, IEnumerable {
public List();
public void Add(T item);
public Int32 BinarySearch(T item);
public void Clear();
public Boolean Contains(T item);
public Int32 IndexOf(T item);
public Boolean Remove(T item);
public void Sort();
public void Sort(IComparer<T> comparer);
public void Sort(Comparison<T> comparison);
public T[] ToArray();
public Int32 Count { get; }
public T this[Int32 index] { get; set; }
}

2 个答案:

答案 0 :(得分:3)

Microsoft使非常易于帮助.NET程序员忘记COM存在。然而,这并不接近现实,COM仍然存在并且仍然是Windows上的主要互操作技术。就像最近的一个例子一样,Store和Phone应用程序中的Modern UI纯粹是基于COM的。虽然非常小心隐藏,但在编写C#应用程序时几乎没有办法告诉您实际使用的是COM。除了看似黑色的魔术,毫不费力地使用Javascript或C ++编写的代码。

.NET中的泛型是一个互操作问题,它是一个纯.NET实现细节,其他非.NET语言完全不知道。因此List<T>不能是[ComVisible(true)]

IList,ICollection和IEnumerable救援,接口 可以通过Windows上几乎任何语言编写的代码进行ComVisible和使用。

答案 1 :(得分:1)

这是一个兼容性问题。 有许多组件(例如,在UI库中),它们使用非通用IList,因为通用版本的使用不是必需的,而且在这里通常是不可取的。

考虑这个WPF样本:

var list = new List<MyDataType>();
var collectionView = new ListCollectionView(list);

假设List<T>没有实现IList - 您只是无法在此示例中使用它。而且,想象一下,ListCollectionView必须是通用的,并尝试实现它。