首页 >后端开发 >C++ >为什么我不能在 C# 中直接将 `List` 转换为 `List`?

为什么我不能在 C# 中直接将 `List` 转换为 `List`?

DDD
DDD原创
2025-01-17 01:01:12324浏览

Why Can't I Directly Cast a `List` to a `List` in C#?

铸造列表到 List

考虑以下代码:

public interface IDic
{
    int Id { get; set; }
    string Name { get; set; }
}
public class Client : IDic
{

}

List<Client> clients = new List<Client>();

许多程序员可能认为他们可以将此 List 转换为 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。这允许将 Banana 对象添加到水果列表中。但是,当访问 apples 列表的第一个元素时,它仍然被视为 Apple。这可能会导致意外的行为和潜在的错误。

安全转换选项

虽然您无法直接转换 List,有安全的方法在这些类型之间进行转换。

  • ToList():在 .NET 4.0 及更高版本中,您可以使用将 List 转换为 ToList() 方法到一个新的列表。此方法创建一个具有相同元素但使用指定接口类型的新列表。
List<IFruit> fruit = apples.ToList<IFruit>();
  • Cast().ToList(): .NET 3.5 中,您可以使用 Cast() 方法来获取IEnumerable来自列表。然后,您可以使用 ToList() 创建一个新的 List ;来自 IEnumerable
List<IFruit> fruit = apples.Cast<IFruit>().ToList();

需要注意的是,这些转换会创建新列表。对一个列表所做的更改不会反映在另一个列表中。但是,对列表中的对象所做的更改将在两个列表中可见。

以上是为什么我不能在 C# 中直接将 `List` 转换为 `List`?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn