我很想知道为什么我的接口(interface)在抽象基类中的实现不满足子类中的要求。下面是一个例子:

public interface IBase { }
public interface IConcrete : IBase { }

public interface IBaseManager<out T>
    where T : IBase
{
    T Create();
    IEnumerable<T> SelectAll();
}

public interface IConcreteManager : IBaseManager<IConcrete> { }

public abstract class Base : IBase { }

public class Concrete1 : Base, IConcrete { }

public abstract class BaseManager<T> : IBaseManager<T> where T : class, IBase
{
    #region IBaseManager<T> Members

    public T Create()
    {
        throw new NotImplementedException();
    }

    public IEnumerable<T> SelectAll()
    {
        throw new NotImplementedException();
    }

    #endregion
}

public class ConcreteManager : BaseManager<Concrete>, IConcereteManager
{
             //error occurs here
}

这是正在生成的错误:



如果我将这些方法添加到 ConcreteManager 类,一切都很好,编译器很高兴。
public new IConcrete Create()
{
    return base.Create();
}

public new IEnumerable<IConcrete> SelectAll()
{
    return base.SelectAll();
}

如果简单地返回基类返回的方法就足够了,为什么还要添加这些方法?为什么编译器不能调用基类中的方法?

最佳答案

看起来您假设返回类型协方差,因为 ConcreteManager (作为 IConcreteManager )期望 Create()SelectAll() 方法分别具有 IConcreteIEnumerable<IConcrete> 的返回类型,而基类不提供这些方法。

因为C#不支持返回类型协方差,所以您得到这些错误。

10-06 14:16