这个C#泛型函数调用有什么问题?

时间:2011-02-17 06:36:42

标签: c# generics

我有一个通用功能

private void PullDataAndBindGrid<T>(GridView grid, List<T> list)
{
    databaseFields = list;
    //BindGrid<T>(grid, list);
}

它被称为

private static List<FieldMaster> databaseFields;
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        PullDataAndBindGrid<FieldMaster>(FieldsGrid, manager.GetAddedFields());
    }
}

我得到编译时错误

  

无法隐式转换类型   'System.Collections.Generic.List<T>'   至   'System.Collections.Generic.List<MailCampaign.DAL.FieldMaster>'

更新:
manager.GetAddedFields()的声明是public List<FieldMaster> GetAddedFields()

可能出现什么问题?

3 个答案:

答案 0 :(得分:3)

罪魁祸首就是这条线

databaseFields = list;

其中databaseFields的类型为List<FieldMaster>,而list的类型为List<T>

由于在实际调用函数之前您不知道T将是什么,因此您不能假设List<T>类型的某些内容可以分配给{{1}类型的变量}。要么摆脱该函数中的泛型,要么将泛型应用于整个类 - 无论哪种方式,都要确保所有内容都保持相同的类型。

答案 1 :(得分:1)

由于您的方法是通用的,因此您不能像在此处一样将任何通用List类型推送到强类型databaseFields字段中:

databaseFields = list;

您应该重新考虑使此方法具有通用性的原因。如果这是必需的,那么我建议你做一个检查,以确保你有正确的类型然后像这样:

private static void PullDataAndBindGrid<T>(List<T> list)
{
    if (list is List<FieldMaster>)
    {
        databaseFields = list as List<FieldMaster>;    
    }       
    //BindGrid<T>(grid, list);
}

答案 2 :(得分:0)

检查该管理器对象上的GetAddedFields()方法的返回类型。