无法将一种类型转换为另一种类型错误

时间:2014-08-15 14:30:55

标签: c# asp.net

我有一个接口和一个实现该接口的类,如下所示:

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接口。

2 个答案:

答案 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();