泛型接口特定化



我尝试给我的泛型接口一个基础。

声明

public interface IMyInterface
{
    ObservableCollection<object> Items {get;}
}
public interface IMyInterface<TValue>
{
     new ObservableCollection<TValue> Items {get;} //Try to override base Items
}

实现

public abstract class MyBase<T> : IMyInterface<T>
{
    private ObservableCollection<T> = _Items;
    public ObservableCollection<T> Items
    {
        get
        {
            return _Items;
        }
    }
    public ObservableCollection<T> IMyInterface.Items
    {
        get
        {
            return _Items as ObservableCollection<T>; //Reason?
        }
    }

用法

void foo(object sender, NotifyCollectionChangedEventArgs e)
{
    foreach(IMyInterface obj in e.NewItems) // e.NewItems are derived from MyBase
    {
        var item = obj.Items; // Problem: item = null
        //Do something
    }
}

但是如果我尝试以这种方式使用它,我就会得到 null。

我的错误是什么?还有其他更好的方法吗?

您的实现是这里的问题。演员阵容将导致null .您只能使用协变接口,因此第一个Items应该是IEnumerable<object>

public interface IMyInterface
{
    IEnumerable<object> Items { get; }
}
public interface IMyInterface<TValue> : IMyInterface
{
    new ObservableCollection<TValue> Items { get; } //Try to override base Items
}
public abstract class MyBase<T> : IMyInterface<T> where T : class
{
    private ObservableCollection<T> _Items;
    public ObservableCollection<T> Items
    {
        get
        {
            return _Items;
        }
    }
    IEnumerable<object> IMyInterface.Items
    {
        get
        {
            return _Items;
        }
    }
}

最新更新