Preferisco utilizzare IEnumerable<object>
, per i metodi di estensione LINQ sono definiti su di esso, non IEnumerable
, in modo che possa utilizzare, ad esempio, range.Skip(2)
. Tuttavia, preferisco anche usare IEnumerable
, per T[]
è implicitamente convertibile in IEnumerable
se T
è un tipo di riferimento o un tipo di valore. Per quest'ultimo caso, non è coinvolta la boxe, il che è positivo. Di conseguenza, posso fare IEnumerable range = new[] { 1, 2, 3 }
. Sembra impossibile combinare il meglio di entrambi i mondi. Comunque, ho scelto di sistemare a IEnumerable
e fare una specie di cast quando ho bisogno di applicare i metodi LINQ.Trasmetti da IEnumerable a IEnumerable <object>
Da this SO thread, vengo a sapere che range.Cast<object>()
è in grado di fare il lavoro. Ma incorre in spese generali di prestazioni che non è necessario a mio parere. Ho provato a eseguire un cast diretto in fase di compilazione come (IEnumerable<object>)range
. Secondo i miei test, funziona per il tipo di elemento di riferimento ma non per il tipo di valore. Qualche idea?
FYI, la domanda deriva dal problema GitHub this. E il codice di prova che ho usato è il seguente:
static void Main(string[] args)
{
// IEnumerable range = new[] { 1, 2, 3 }; // won't work
IEnumerable range = new[] { "a", "b", "c" };
var range2 = (IEnumerable<object>)range;
foreach (var item in range2)
{
Console.WriteLine(item);
}
}
Vuoi davvero dire '' IEnumerable