当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《通用扩展方法:无法从用法推断出类型参数》经验,为你挑选了1个好方法。

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

public static class Extensions
{
    public static TableType DoSomething(this TableType table, param Expression>[] predicates)
        where TableType : TypedTableBase
        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(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
    }
}

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

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

谢谢



1> Eric Lippert..:

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

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

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

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

我保持自己的立场.


我很害怕...感谢答案
推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有