使用以下代码,我在"返回书籍"上收到"无法隐式转换"编译错误.线.
我认为,因为我返回一个实现IPublication的书籍对象列表,这应该工作正常吗?
public interface IPublication {}
public class Book : IPublication {}
public List<IPublication> GetBooks()
{
List<Book> books = new List<Book>();
return books;
}
Run Code Online (Sandbox Code Playgroud)
我注意到,如果我将一本书作为单个IPublication对象返回,它可以正常工作.介绍List<>需要显式转换.
作为我正在使用的解决方法:
return books.Cast<IPublication>().ToList();
Run Code Online (Sandbox Code Playgroud)
问题是a List<IPublication>可以容纳任何继承的类IPublication.由于编译器不知道你不会尝试将Magazine结果放入GetBooks(),你必须像这样写你的函数:
public List<IPublication> GetBooks()
{
List<IPublication> books = new List<IPublication>();
// put only books in here
return books;
}
Run Code Online (Sandbox Code Playgroud)
如果你的函数返回一个不需要通过索引访问的不可变列表(并且你在C#4上),你可以这样写:
public IEnumerable<IPublication> GetBooks()
{
List<Book> books = new List<Book>();
return books;
}
Run Code Online (Sandbox Code Playgroud)
如果您可以返回IEnumerable<T>但是您正在使用C#3,那么您可以执行cdhowie建议的操作:
public IEnumerable<IPublication> GetBooks()
{
List<Book> books = new List<Book>();
return books.Cast<IPublication>();
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是C#2,最好只使用我提出的第一种方法.