铸造列表
考虑以下代码:
public interface IDic { int Id { get; set; } string Name { get; set; } } public class Client : IDic { } List<Client> clients = new List<Client>();
许多程序员可能认为他们可以将此 List
List<IDic> dics = (List<IDic>)clients;
但是,这不是有效的转换。不允许这种类型的强制转换,因为它会违反类型安全。如果您尝试进行此转换,将会出现以下错误:
Cannot convert type 'System.Collections.Generic.List<Client>' to 'System.Collections.Generic.List<IDic>'
为什么不允许此转换?
不允许此转换的原因是潜在的不安全行为。例如,想象一下这种情况:
public interface IFruit {} public class Apple : IFruit {} public class Banana : IFruit {} ... List<Apple> apples = new List<Apple>(); List<IFruit> fruit = (List<IFruit>)apples; // Assumed cast fruit.Add(new Banana()); // Eek - it's a banana! Apple apple = apples[0];
在此示例中,List
安全转换选项
虽然您无法直接转换 List
List<IFruit> fruit = apples.ToList<IFruit>();
List<IFruit> fruit = apples.Cast<IFruit>().ToList();
需要注意的是,这些转换会创建新列表。对一个列表所做的更改不会反映在另一个列表中。但是,对列表中的对象所做的更改将在两个列表中可见。
以上是为什么我不能在 C# 中直接将 `List` 转换为 `List`?的详细内容。更多信息请关注PHP中文网其他相关文章!