Non riesco a capire perché il seguente codice C # non viene compilato.
Come puoi vedere, ho un metodo generico statico Qualcosa con un IEnumerable<T>
parametro (ed T
è vincolato a essere IA
un'interfaccia) e questo parametro non può essere convertito implicitamente in IEnumerable<IA>
.
Qual è la spiegazione? (Non cerco una soluzione alternativa, solo per capire perché non funziona).
public interface IA { }
public interface IB : IA { }
public class CIA : IA { }
public class CIAD : CIA { }
public class CIB : IB { }
public class CIBD : CIB { }
public static class Test
{
public static IList<T> Something<T>(IEnumerable<T> foo) where T : IA
{
var bar = foo.ToList();
// All those calls are legal
Something2(new List<IA>());
Something2(new List<IB>());
Something2(new List<CIA>());
Something2(new List<CIAD>());
Something2(new List<CIB>());
Something2(new List<CIBD>());
Something2(bar.Cast<IA>());
// This call is illegal
Something2(bar);
return bar;
}
private static void Something2(IEnumerable<IA> foo)
{
}
}
Errore mi metto in Something2(bar)
linea:
Argomento 1: impossibile convertire da "System.Collections.Generic.List" a "System.Collections.Generic.IEnumerable"
T
ai tipi di riferimento. Se usi la condizione where T: class, IA
, dovrebbe funzionare. La risposta collegata ha più dettagli.
Something2(foo);
direttamente. Andare in giro .ToList()
per ottenere un List<T>
( T
è il tuo parametro di tipo dichiarato dal metodo generico) non è necessario per capirlo (a List<T>
è an IEnumerable<T>
).