通用扩展方法:无法从用法推断出类型参数

Pie*_*let 15 c# database generics lambda

我正在尝试创建一个适用于类型化数据表的通用扩展方法:

public static class Extensions
{
    public static TableType DoSomething<TableType, RowType>(this TableType table, param Expression<Func<RowType, bool>>[] predicates)
        where TableType : TypedTableBase<RowType>
        where RowType : DataRow
    {
        // do something to each row of the table where the row matches the predicates
        return table;
    }

    [STAThread]
    public static void main()
    {
        MyTypedDataSet.MyTypedDataTable table = getDefaultTable();
    }

    public static MyTypedDataSet.MyTypedDataTable getDefaultTable()
    {
        // this line compiles fine and does what I want:
        return new MyTypedDataSet.MyTypedDataTable().DoSomething<MyTypedDataSet.MyTypedDataTable, MyTypedDataSet.MyTypedRow>(row => row.Field1 == "foo");

        // this line doesn't compile :
        return new MyTypedDataSet.MyTypedDataTable().DoSomething(row => row.Field1 == "foo");
        // Error : The type arguments .. cannot be inferred from the usage
    }
}
Run Code Online (Sandbox Code Playgroud)

第一线工作正常,但它确实难看......
第二行不编译因为编译器不能推断类型行类型.
这是一种方法,将被许多不同的程序员用作DataLayer的一部分,所以我宁愿不需要它们来指定TypeParameter.
如果不是编译器知道ROWTYPE是同样的类型使用由TypedTableBase的人吗?

由于在此代码示例中可能不明显的不同原因,我确实需要以原始形式返回数据表.我需要RowType的原因是IntepSence会输入'Expression <Func <T,bool> >'.

谢谢

Eri*_*ert 22

方法类型推断不会从参数到约束进行推断.它从形式参数的参数推断,然后检查从形式的参数做出的推断是否满足约束.

在你的情况下,没有足够的参数数据来推断出类型参数是什么,而不首先查看约束,在我们检查对约束的推断之前我们不会做.很抱歉,但这就是指定类型推断算法的方式.

我多次被问到有关这方面的问题,而且我的共识似乎是我在维持推理应该仅仅从形式参数的论证中推断的立场上是错误的.有十几个人告诉我,我在这方面有错误,请参阅我对这个密切相关问题的分析评论:

http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx

我保持自己的立场.

  • 我很害怕...感谢答案 (4认同)
  • 这是过期链接的 WayBack Machine 版本:https://web.archive.org/web/20100922123630/http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-不是签名的一部分.aspx (2认同)