【问题标题】:Solving The type arguments for method cannot be inferred from the usage解决方法的类型参数不能从用法中推断出来
【发布时间】: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&lt;object&gt;,这没有帮助。
  • 你能做的最接近的是让chooseList返回一个基于类型参数的列表(例如,让它public BindingList&lt;T&gt; ChooseList&lt;T&gt;()),但你不能摆脱在编译时指定你想要的类型-时间。
  • 感谢您提供的信息。我添加了我试图转换的代码。如果真的没有办法像我写的那样做,有没有其他方法可以将切换缩短为方法调用之类的?
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# generics


【解决方案1】:

您需要让BindingList&lt;T&gt; 派生自非泛型抽象类型或接口BindingListIBindingList。然后你需要一个TakeList() 重载,它可以接受非泛型类型的东西。请注意,通用形式可能会隐藏抽象接口中的某些方法,以便例如Add(object) 将被 Add(T) 遮蔽;其他方法可能会被重载,因此Contains(object)Contains(T) 都可以使用[前者允许人们检查List&lt;Cat&gt; 是否包含Animal;即使Animal 不是从Cat 派生的,Animal 类型的变量也可以包含对SiameseCat 实例的引用,确实如此]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多