C# C:ObservableCollection-为什么没有通用的“CollectionChanged”事件?

C# C:ObservableCollection-为什么没有通用的“CollectionChanged”事件?,c#,events,generics,language-design,C#,Events,Generics,Language Design,这与其说是一个问题,更让我感到奇怪的是:ObservableCollection类是泛型的,但它在更改为集合时引发的CollectionChanged事件不是泛型的。这意味着在事件处理程序中,必须将从事件args对象获得的NewItems/OldItems集合中的所有对象强制转换为正确的项目类型 但是,难道不应该简单地让这个事件变得通用吗?差不多 public virtual event NotifyCollectionChangedEventHandler<T> Collectio

这与其说是一个问题,更让我感到奇怪的是:ObservableCollection类是泛型的,但它在更改为集合时引发的CollectionChanged事件不是泛型的。这意味着在事件处理程序中,必须将从事件args对象获得的NewItems/OldItems集合中的所有对象强制转换为正确的项目类型

但是,难道不应该简单地让这个事件变得通用吗?差不多

public virtual event NotifyCollectionChangedEventHandler<T> CollectionChanged;

然后

public class NotifyCollectionChangedEventArgs<T> {
    // ...
    public IList<T> NewItems { get; }
    public IList<T> OldItems { get; }
毕竟,类型参数T已经由所讨论的ObservableCollection的声明确定,这意味着您无论如何都不能将任何不属于类型T或与类型T不兼容的对象添加到集合中。因此,所有这些都应该是完全类型安全的,并且避免了将事件处理程序中的对象强制转换为我们知道它们应该具有的任何类型的麻烦


我不这么做有什么原因吗?也就是说,这是一个有意识的设计决策,还是仅仅是一个疏忽?

INotifyCollectionChanged接口以及INotifyPropertyChanged是专门为WPF框架设计的。因为WPF是松散类型的,所以我猜泛型不是该设计的一部分。我不认为INotifyCollectionChanged是为了直接消费而设计的。然而,ObservableCollection被设计为由C代码使用,C代码是强类型的,因此泛型是设计中的特色

INotifyCollectionChanged接口以及INotifyPropertyChanged是专门为WPF框架设计的。因为WPF是松散类型的,所以我猜泛型不是该设计的一部分。我不认为INotifyCollectionChanged是为了直接消费而设计的。然而,ObservableCollection被设计为由C代码使用,C代码是强类型的,因此泛型是设计中的特色

如果我没有记错,但我很可能是错的,这与WPF有关,WPF不能与泛型一起工作,但需要知道如何倾听集合更改ObservableCollection的引入基本上是为了WPF,所以这是有意义的如果我没有记错,但我很可能是错的,这与此有关对于无法使用泛型但需要知道如何侦听集合更改的WPF,ObservaleCollection的引入基本上是为了WPF,因此有意义。NotifyPropertyChanged是在.NET 2.0中引入的,因此它肯定不是专门为WPF设计的。InotifyPropertyChanged是同时引入的用于原始windows窗体中数据绑定的IErrorInfo。绑定源仅处理类型“Object”。ObservableCollection实现INotifyCollectionChanged以及INotifyPropertyChanged,INotifyPropertyChanged是在.NET 2.0中引入的,因此它肯定不是专门为WPF设计的。INotifyPropertyChanged是在原始windows窗体中为数据绑定引入IErrorInfo的同时引入的。绑定源仅处理类型“Object”。ObservableCollection实现INotifyCollectionChanged以及INotifyPropertyChanged,
public class NotifyCollectionChangedEventArgs<T> {
    // ...
    public IList<T> NewItems { get; }
    public IList<T> OldItems { get; }