Вы не можете разыграть это (сохранение ссылочной идентичности) - это было бы небезопасно. Например:
public interface IFruit {}
public class Apple : IFruit {}
public class Banana : IFruit {}
...
List<Apple> apples = new List<Apple>();
List<IFruit> fruit = apples; // Fortunately not allowed
fruit.Add(new Banana());
// Eek - it's a banana!
Apple apple = apples[0];
Теперь вы можете преобразовать List<Apple>
в IEnumerable<IFruit>
в .NET 4 / C # 4 из-за ковариации, но если вы хотите List<IFruit>
, вам придется создать новый список , Например:
// In .NET 4, using the covariance of IEnumerable<T>
List<IFruit> fruit = apples.ToList<IFruit>();
// In .NET 3.5
List<IFruit> fruit = apples.Cast<IFruit>().ToList();
Но это , а не - это то же самое, что и приведение исходного списка - потому что теперь есть два отдельных списка. Это безопасно, но вы должны понимать, что изменения, внесенные в один список , не будут видны в другом списке. (Конечно, будут видны модификации объектов , на которые ссылаются списки.)