Скажем, у меня есть метод, ожидающий общий набор параметров базового типа, см. Test.MethodA (IEnumerable (BaseClass) listA) ниже. Почему, когда я передаю ему коллекцию производного типа, код не будет создан? Не все ли экземпляры DerivedClass также будут BaseClass?Передача общей коллекции объектов методу, который требует набора базового типа
я мог бы просто создал новый список (BaseClass) и передал, что в Methoda (IEnumerable (BaseClass) lišta). Но я бы подумал, что 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>());
}
}
Возможный дубликат [Литье общей коллекции в базовый тип] (http://stackoverflow.com/questions/539287/casting-a-generic-collection-to-base-type) – outis