【发布时间】:2013-10-02 20:56:40
【问题描述】:
我收到此错误:
无法从用法中推断方法“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));
}
}
【问题讨论】:
-
chosenList of type object not type BindingList
-
你所做的事情本身就毫无意义。方法的返回类型必须在编译时知道,泛型只是让您表达高阶类型约束。
chooseList()可以返回的唯一明智的事情是IEnumerable<object>,这没有帮助。 -
你能做的最接近的是让
chooseList返回一个基于类型参数的列表(例如,让它public BindingList<T> ChooseList<T>()),但你不能摆脱在编译时指定你想要的类型-时间。 -
感谢您提供的信息。我添加了我试图转换的代码。如果真的没有办法像我写的那样做,有没有其他方法可以将切换缩短为方法调用之类的?
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。