2011-02-17 58 views
0

我有一个通用的功能这个C#泛型函数调用有什么问题?

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()

出了什么问题?

回答

1

因为你的方法是通用的,你不能把任何泛型列表类型为强类型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); 
} 
+0

+1:有一个坚定和不屈的需要。这就是为什么。 :)是'is`是检查T类型的最好方法,因为我需要根据T – naveen 2011-02-17 06:55:53

0

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

3

罪魁祸首是这条线

databaseFields = list; 

其中databaseFieldsList<FieldMaster>类型,list类型为List<T>

既然你不知道T会是什么,直到你真正调用的函数,您不能认为某种类型的List<T>可以分配给List<FieldMaster>类型的变量。要么摆脱该功能中的泛型,要么将泛型应用于整个班级 - 无论哪种方式,都要确保所有内容都保证具有相同的类型。