为什么不能在接口定义中使用IList <t>并在inplementation中使用List <t>?</t> </t>

时间:2010-12-16 08:50:17

标签: c#

为什么不能在接口定义中使用IList然后使用List实现此属性?我在这里遗漏了什么,或者只是C#编译器不允许这样做?

public interface ICategory
{
    IList<Product> Products { get; }
}

public class Category : ICategory
{
    public List<Product> Products { get { new List<Product>(); } }        
}

编译器说错误82'类别'没有实现接口成员'ICategory.Products'。 'Category.Products'无法实现'ICategory.Products',因为它没有匹配的返回类型'System.Collections.Generic.IList'

3 个答案:

答案 0 :(得分:8)

将您的代码更改为:

public interface ICategory
{
    IList<Product> Products { get; }
}

public class Category : ICategory
{
    // Return IList<Product>, not List<Product>
    public IList<Product> Products { get { new List<Product>(); } }        
}

实现接口方法时,无法更改接口方法的签名。

答案 1 :(得分:0)

接口的方法与实现接口方法的具体方法之间必须是精确匹配。一个选项是显式接口实现,它允许您满足接口,同时在类型上保留更具体的公共API。并且通常只代理方法,因此没有代码重复:

public interface ICategory
{
    IList<Product> Products { get; }
}

public class Category : ICategory
{
    IList<Product> ICategory.Products { get { return Products ; } }
    public List<Product> Products { get { ...actual implementation... } }        
}

答案 2 :(得分:0)

这样可行

public interface ICategory<out T> where T:IList<Product>
    {
        T Product { get; }
    }

public class Category : ICategory<List<Product>>
    {
        public List<Product> Products
        {
            get
            {
                throw new NotImplementedException();
            }
        }
    } 

虽然复杂但可能。