求解 方法的类型参数无法从用法中推断出来
本文关键字:用法 推断出 方法 类型参数 求解 | 更新日期: 2023-09-27 18:33:50
我收到此错误:方法' 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
实例的引用, 确实如此]。