2009-12-20 53 views
0

我在Silverlight中的一个项目上工作,我想知道ObservableCollection是如何工作的。我很惊讶地看到这在反射器:2反射代码中具有相同名称的事件?

public class ObservableCollection<T> : 
      Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged 
{ 
    // Fields 
    private bool _busy; 

    // Events 
    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    protected event PropertyChangedEventHandler PropertyChanged; 

    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged; 
... 

它怎么能有2个事件具有相同的名称和类型?这是怎么回事?这是Reflector中的错误吗?

回答

2

不,这是explicit interface implementation。此行:

protected event PropertyChangedEventHandler PropertyChanged; 

无法实施INotifyPropertyChanged合同,因为它不是公共的。其他类不能引用它,所以ObservableCollection不会像它实现它所说的接口那样看待它的客户端。例如。

ObservableCollection<string> coll; 
// ObservableCollection implements INotifyPropertyChanged, so I should be able to... 
coll.PropertyChanged += ... 
// ... but this wouldn't compile because PropertyChanged is protected 

为了解决这个问题,增加的ObservableCollection另一实施的PropertyChanged,这是 “作用域”,以INotifyPropertyChanged接口的。也就是说,它只有在客户端通过类型INotifyPropertyChanged的引用访问ObservableCollection时才可用,在这种情况下,它是有效公开的。所以,现在谁想要使用的ObservableCollection实现INotifyPropertyChanged会很高兴的事实,因为他们正在寻找的事件是有客户:

INotifyPropertyChanged notifier = coll; 
notifier.PropertyChanged += ... // compiles (using explicit implementation) 

但增加的PropertyChanged不具有相同的保护成员发生冲突名称,因为它的范围是INotifyPropertyChanged.前缀。

0

它被称为显式声明。泛型集合可以有两个GetEnumerator()方法。一个被宣布为公开;另一个被宣布为明确的。