我有一个接口和一个实现该接口的类,如下所示:
public interface Grid_Result
{
}
public partial class Contract_GetSubsetList_Result : Grid_Result
{
}
然后我有一个方法,我调用它来返回一个IEnumerable的Grid_Result项:
public IEnumerable<Grid_Result> GetModelForGrid(string fitlerBy, int filterType, int startIndex, int pageSize){...}
所有这一切都很好,但是当我尝试用我的方法调用时:
List<Contract_GetSubsetList_Result> results = testcontroller.GetModelForGrid(regNumFilter, filterBy,
startIndex, pageSize).ToList();
我收到错误:
Cannot implicitly convert type 'System.Collections.Generic.List<Test.Grid_Result>' to 'System.Collections.Generic.List<Test.Contract_GetSubsetList_Result>'
我不确定为什么,因为Contract_GetSubsetList_Result确实实现了Grid_Result接口。
答案 0 :(得分:5)
由于IEnumerable<T>
是协变的,但List<T>
不是,因此您无法将List<T>
投射到List<{superclass of T}>
您可以在创建列表之前使用Cast<T>
投射:
List<Contract_GetSubsetList_Result> results =
testcontroller.GetModelForGrid(regNumFilter, filterBy, startIndex, pageSize)
.Cast<Contract_GetSubsetList_Result> // if you KNOW all objects will be of type Contract_GetSubsetList_Result
.ToList();
答案 1 :(得分:1)
在这一行
List<Contract_GetSubsetList_Result> results = testcontroller.GetModelForGrid(regNumFilter, filterBy, startIndex, pageSize).ToList();
所有编译器都知道GetModelForGrid
返回Grid_Result
列表。它不知道这些项目是否实际上是Contract_GetSubsetList_Result
;你必须用演员明确告诉它:
List<Contract_GetSubsetList_Result> results = testcontroller.GetModelForGrid(regNumFilter, filterBy, startIndex, pageSize).Cast<Grid_Result>().ToList();