2008-11-06 22 views
5

situación tan extraño que me encontré hoy con OrdenarPor:C# 3.0 Func/OrdenarPor inferencia de tipos

Func<SomeClass, int> orderByNumber = 
    currentClass => 
    currentClass.SomeNumber; 

continuación:

someCollection.OrderBy(orderByNumber); 

Esto está muy bien, pero yo iba a crear un método en lugar porque podría ser utilizable en otro lugar que no sea una orden Por.

private int ReturnNumber(SomeClass currentClass) 
{ 
    return currentClass.SomeNumber; 
} 

Ahora cuando intento para tapar que en el OrdenarPor:

someCollection.OrderBy(ReturnNumber); 

No puede inferir el tipo como puede si uso un Func. Me parece que deberían ser iguales ya que el método en sí mismo está "fuertemente tipado" como el Func.

Nota al margen: Me doy cuenta que puedo hacer esto:

Func<SomeClass, int> orderByNumber = ReturnNumber; 

Respuesta

8

Esto también podría estar relacionado con "return-type type inference" not working on Method Groups.

Básicamente, en casos (como el predicado Where) donde los parámetros genéricos están solo en las posiciones de entrada, la conversión del grupo de métodos funciona bien. Pero en los casos donde el parámetro genérico es un tipo de retorno (como las proyecciones Select o OrderBy), el compilador no deducirá la conversión de delegado apropiada.

8

ReturnNumber es no un método - en cambio, representa un grupo que contiene método todos métodos con el nombre ReturnNumber pero con potencialmente diferentes firmas-y de tipo aridad. Hay algunos problemas técnicos para averiguar qué método en ese grupo de métodos realmente desea de una manera muy genérica y que funciona siempre. Obviamente, el compilador podría averiguarlo, incluso la mayoría de las veces, pero se tomó la decisión de poner un algoritmo en el compilador que funcionaría solo la mitad de las veces era una mala idea.

Los siguientes obras, sin embargo:

someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber)) 
+0

grupo método es algo que no estaba pensando. Ojalá pudiera marcar dos respuestas. –

Cuestiones relacionadas