为什么不能在接口定义中使用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'
答案 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();
}
}
}
虽然复杂但可能。