Próbuję przekazać listę DerivedClass
do funkcji, która pobiera listę BaseClass
, ale pojawia się błąd:nie można przekonwertować z List <DerivedClass> do listy <BaseClass>
cannot convert from
'System.Collections.Generic.List<ConsoleApplication1.DerivedClass>'
to
'System.Collections.Generic.List<ConsoleApplication1.BaseClass>'
Teraz mogę rzucić My List<DerivedClass>
do List<BaseClass>
, ale nie czuję się komfortowo, że chyba rozumiem dlaczego kompilator nie pozwala na to.
Wyjaśnienia, że znalazłem się po prostu powiedział, że narusza bezpieczeństwo typu jakoś, ale nie widzę go. Czy ktoś może mi pomóc?
Jakie ryzyko wiąże się z kompilatorem umożliwiającym konwersję z List<DerivedClass>
na List<BaseClass>
?
Oto mój SSCCE:
class Program
{
public static void Main()
{
BaseClass bc = new DerivedClass(); // works fine
List<BaseClass> bcl = new List<DerivedClass>(); // this line has an error
doSomething(new List<DerivedClass>()); // this line has an error
}
public void doSomething(List<BaseClass> bc)
{
// do something with bc
}
}
class BaseClass
{
}
class DerivedClass : BaseClass
{
}
Klasa wywodzi się od jego podstawy, ale nie '' Lista wywodzi się od '' Lista . –
@TimSchmelter Czy to oznacza, że tego rodzaju dziedziczenie może potencjalnie stać się funkcją, w której 'Generic' może być uważana za pochodną 'Generic '? lub czy taka funkcja może powodować problemy? –
Po prostu nie jest to realizowane w ten sposób. http://marcgravell.blogspot.fr/2009/02/what-c-40-covariance-doesn-do.html –