求解 方法的类型参数无法从用法中推断出来

本文关键字:用法 推断出 方法 类型参数 求解 | 更新日期: 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>从非泛型抽象类型或接口派生BindingListIBindingList。 然后,您需要一个可以接受该非泛型类型的TakeList()重载。 请注意,泛型形式可能应该隐藏抽象接口中的某些方法,以便例如 Add(object)会被Add(T)遮蔽;其他方法可以重载,这样Contains(object)Contains(T)都可以使用[前者将允许人们检查List<Cat>是否包含Animal;即使Animal不是从Cat派生的,类型Animal的变量可以保存对SiameseCat实例的引用, 确实如此]。