编译器在决定是否可以将 GetBookTitles 的结果分配给变量时使用方法的签名,而不是实现,因此它无法知道结果实际上是一个 List。如果它允许你做这样的事情,那么你可以写这样的东西:
List<string> myBooks = GetBookTitles();
myBooks.Sort();
在您的示例中,您可以这样做,实际上,如果您转换方法的结果,则可以:
List<string> myBooks = (List<string>)GetBookTitles();
但是有一天你可能会决定你的藏书是不可修改的,然后你重写你的方法如下:
public IList<string> GetBookTitles()
{
IList<string> tmp = new List<string>();
// do something to populate the bookTitles list.
IList<string> bookTitles = new ReadOnlyCollection<string>(tmp);
return bookTitles;
}
ReadOnlyCollection 不实现排序,因此您的应用程序会编译,但会在运行时崩溃。使用强制转换方法在尝试进行强制转换时会崩溃,但在这种情况下,您有责任确定这种强制转换是可行的,并且编译器不会试图猜测。
更好的方法是使用 as 而不是 cast 和 chek for null。IE:
List<string> myBooks = GetBookTitles() as List<string>;
if (myBooks != null)
myBooks.Sort();