Общий метод расширения: аргумент типа не может быть выведен из использования

Я пытаюсь создать универсальный метод расширения, который работает с типизированными таблицами данных:

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
    }
}

Первая строка работает нормально, но она действительно уродлива ...
Вторая строка не компилируется, потому что компилятор не может определить тип RowType .
Это метод, который будет использоваться как часть DataLayer многими разными программистами, поэтому я бы не хотел, чтобы они указывали TypeParameter.
Разве компилятор не должен знать, что RowType является тем же типом, который использовался TypedTableBase?

По разным причинам, которые могут быть не очевидны в этом примере кода, мне действительно нужно вернуть datatable в первоначальном виде. И причина, по которой мне нужно RowType , заключается в том, что 'Expression < Func < T, bool> > ' будет напечатан и увиден InteliSence.

Спасибо

15
задан Pierre-Olivier Goulet 2 September 2010 в 18:42
поделиться