2013-10-02 37 views
0

我得到这个错误: 方法'ConsoleApplication1.Program.takeList<T>System.ComponentModel.BindingList<T>)'的类型参数不能从使用推断。尝试明确指定类型参数。解决方法的类型参数不能从使用推断

我相信编译器无法猜测chooseList方法的返回类型,但它必须将它传递给takeList方法。有没有办法让这个工作,但不解耦chooseList方法到Main函数??

class Program 
{ 
    static BindingList<int> listOfInts; 
    static BindingList<string> listOfStrings; 
    //more lists 

    static void takeList<T>(BindingList<T> list) 
    { 
     //do something 
     return; 
    } 

    static object chooseList() //instead of object i would put BindingList<T> 
    { 
     int someCondition = 0; 

     //code that changes someCondition so compiler doesnt know its value 

     switch (someCondition) 
     { 
      case 1: return listOfInts; 

      //more cases for more lists 

      default: return listOfStrings; 
     } 
    } 

    static void Main(string[] args) 
    { 
     Program testClass = new Program(); 
     var chosenList = chooseList(); 
     takeList(chosenList); 
    } 
} 

编辑:

这里是一个相反的情况应该工作。我想将它转化成以上:

class Program 
{ 
    static BindingList<int> listOfInts; 
    static BindingList<string> listOfStrings; 
    //more lists 

    static void takeList<T>(BindingList<T> list) 
    { 
     //do something 
     return; 
    } 

    static void Main(string[] args) 
    { 
     Program testClass = new Program(); 

     int someCondition = 0; 

     //code that changes someCondition so compiler doesnt know its value 

     switch (someCondition) 
     { 
      case 1: 
       takeList(listOfInts); 
       break; 

      //more cases for more lists 

      default: 
       takeList(listOfStrings); 
       break; 
     } 

     //Instead of the switch here, i would like to write takelist(doTheSwitch(someCondition)); 
    } 
} 
+0

selectedList对象类型不是类型BindingList – aqwert

+3

你在做什么天生没有任何意义。方法的返回类型必须在* compile-time *处知道,泛型只是让您表达更高阶的类型约束。 'chooseList()'唯一明智的事情是'IEnumerable ',这是没有用的。 – millimoose

+0

你可以做的最接近的是让'chooseList'返回一个基于类型参数的列表(例如,使它成为'public BindingList ChooseList ()'),但是你不能摆脱在编译时指定你想要的类型,时间。 – millimoose

回答

1

你需要的是有BindingList<T>从非通用抽象类型或接口BindingListIBindingList派生。然后您需要一个TakeList()重载,它可以接受某种非泛型类型。请注意,通用表单应该可能会影响抽象接口中的一些方法,例如Add(object)将被Add(T)遮挡;其他方法可能会超载,因此Contains(object)Contains(T)都可以使用[前者将允许人们检查List<Cat>是否包含Animal;即使Animal不是来自CatAnimal类型的变量可以持有对SiameseCat的实例的引用,其实例为]。

+0

谢谢,会试试这个。 –

相关问题