解决方法的类型参数不能从使用推断
问题描述:
我得到这个错误: 方法'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));
}
}
答
你需要的是有BindingList<T>
从非通用抽象类型或接口BindingList
或IBindingList
派生。然后您需要一个TakeList()
重载,它可以接受某种非泛型类型。请注意,通用表单应该可能会影响抽象接口中的一些方法,例如Add(object)
将被Add(T)
遮挡;其他方法可能会超载,因此Contains(object)
和Contains(T)
都可以使用[前者将允许人们检查List<Cat>
是否包含Animal
;即使Animal
不是来自Cat
,Animal
类型的变量可以持有对SiameseCat
的实例的引用,其实例为]。
+0
谢谢,会试试这个。 –
selectedList对象类型不是类型BindingList – aqwert
你在做什么天生没有任何意义。方法的返回类型必须在* compile-time *处知道,泛型只是让您表达更高阶的类型约束。 'chooseList()'唯一明智的事情是'IEnumerable
你可以做的最接近的是让'chooseList'返回一个基于类型参数的列表(例如,使它成为'public BindingList ChooseList ()'),但是你不能摆脱在编译时指定你想要的类型,时间。 –
millimoose