UPDATE: Il seguente codice ha senso solo in C# 4.0 (Visual Studio 2010)covarianza/controvarianza: come rendere il seguente codice compilare
Sembra che io sto avendo qualche incomprensione della covarianza/cosa controvarianza . Qualcuno può dirmi perché il seguente codice non viene compilato?
public class TestOne<TBase>
{
public IEnumerable<TBase> Method<TDerived>(IEnumerable<TDerived> values)
where TDerived: TBase
{
return values;
}
}
mentre questo compila: (!!!)
public interface IBase
{
}
public interface IDerived: IBase
{
}
public class TestTwo
{
public IEnumerable<IBase> Method(IEnumerable<IDerived> values)
{
return values;
}
}
@ Adamo: Credo che vi sbagliate, '' IEnumerable non è '' IEnumerable di default in modo che non sarebbe compilare anche in '3.5' –
sll
@AdamMihalcin: No, che il codice * no * ho compilato prima di .NET 4. Ho appena provato da solo per verificarlo. Senza invarianza generica, la conversione da 'IEnumerable' a 'IEnumerable ' è semplicemente non valida. –
buona chiamata su TSuper, appena corretto che –