Domanda

Situazione così strana che mi sono imbattuto oggi con OrderBy:

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

Quindi:

someCollection.OrderBy(orderByNumber);

Va ??bene, ma stavo per creare un metodo perché potrebbe essere utilizzabile da qualche altra parte oltre a un orderBy.

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

Ora quando provo a collegarlo a OrderBy:

someCollection.OrderBy(ReturnNumber);

Non posso inferire il tipo come può se uso un Func. Mi sembra che dovrebbero essere gli stessi poiché il metodo stesso è "fortemente tipizzato" come il Func.

Nota a margine: mi rendo conto di poterlo fare:

Func<SomeClass, int> orderByNumber = ReturnNumber;
È stato utile?

Soluzione

Ciò potrebbe anche essere correlato a " inferenza del tipo restituito " non funziona su gruppi di metodi .

In sostanza, nei casi (come il predicato di Where ) in cui i parametri generici sono solo in posizioni di input, la conversione del gruppo di metodi funziona bene. Ma nei casi in cui il parametro generico è un tipo restituito (come Select o OrderBy ), il compilatore non inferirà la conversione delegata appropriata.

Altri suggerimenti

ReturnNumber non è non un metodo, invece rappresenta un gruppo di metodi contenente tutti con il nome ReturnNumber ma con firme arity e type potenzialmente diverse. Ci sono alcuni problemi tecnici nel capire quale metodo in quel gruppo di metodi desideri effettivamente in un modo molto generico e funziona ogni volta. Ovviamente, il compilatore poteva capirlo un po ', anche la maggior parte delle volte, ma fu presa la decisione che inserire un algoritmo nel compilatore che avrebbe funzionato solo la metà delle volte era una cattiva idea.

Tuttavia, le seguenti opere:

someCollection.OrderBy(new Func<SomeClass, int>(ReturnNumber))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top