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 IAun'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"
Tai 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>).