Передача общей коллекции объектов в метод, который требует коллекцию базового типа
Скажем, у меня есть метод, который ожидает универсальный параметр коллекции базового типа, см.Test.MethodA(IEnumerable(BaseClass) listA) ниже. Почему, когда я передаю ему коллекцию производного типа, код не будет собираться? Не все случаиDerivedClass также бытьBaseClass?
Я мог бы просто создать новыйList(BaseClass) и передал этоMethodA(IEnumerable(BaseClass) listA), Но я думаю, что C # был бы достаточно умен, чтобы знать, что коллекция DerivedClass имеет все те же свойства, что и коллекция BaseClass.
Является ли использование метода List.Cast (T) (), как я показал, наилучшим способом решения этой проблемы?
abstract class BaseClass
{
public int SomeField;
public abstract string SomeAbstractField
{
get;
}
}
class DerivedClass:BaseClass
{
public override string SomeAbstractField
{
get { return "foo"; }
}
}
class TestClass
{
public void MethodA(IEnumerable<BaseClass> listA)
{
}
public void MethodB()
{
List<DerivedClass> listB = new List<DerivedClass>();
//Error 16 The best overloaded method match for
//TestClass.MethodA(List<BaseClass>)'
//has some invalid arguments
this.MethodA(listB);
//this works
this.MethodA(listB.Cast<BaseClass>());
}
}