Estoy tratando de crear un método de extensión genérica, que funciona en las tablas de datos proporcionado:extensión genérica método: argumento de tipo no se puede deducir de la utilización
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
}
}
La primera línea funciona bien, pero es muy feo ...
La segunda línea no se compila porque el compilador no puede inferir el tipo de RowType.
Este es un método que muchos programadores diferentes utilizarán como parte de un DataLayer, por lo que preferiría no necesitar que especifiquen el TypeParameter.
¿No debería el compilador saber que RowType es del mismo tipo que el utilizado por TypedTableBase?
Por diferentes razones que pueden no ser obvias en este ejemplo de código, realmente necesito devolver la tabla de datos en su forma original. Y la razón por la que necesito RowType es por lo que la 'Expresión <
Func <
T, bool>>
' será escrita y vista por InteliSence.
Gracias
Tenía miedo de eso ... gracias por la respuesta –
Tienes razón :) – Brian