如何正确返回接口列表类型?

dan*_*dan 8 c# interface list

使用以下代码,我在"返回书籍"上收到"无法隐式转换"编译错误.线.

我认为,因为我返回一个实现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)

Gab*_*abe 9

问题是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,最好只使用我提出的第一种方法.