C# C语言中的强制转换列表对象#

C# C语言中的强制转换列表对象#,c#,casting,C#,Casting,我需要将一个列表对象强制转换为另一个列表对象,它是一个接口 public class THold : IHold {..} 这里,IHold是接口 我想这样做: List<THold> hold = new List<THold>(); List<IHold> test = hold; List hold=newlist(); 列表测试=保持; 您最接近的目标是: List<IHold> test = hold.Cast<IHold>

我需要将一个列表对象强制转换为另一个列表对象,它是一个接口

public class THold : IHold
{..}
这里,IHold是接口

我想这样做:

List<THold> hold = new List<THold>();
List<IHold> test = hold;
List hold=newlist();
列表测试=保持;

您最接近的目标是:

List<IHold> test = hold.Cast<IHold>().ToList();
然后:

List<THold> holds = new List<THold>();
List<IHold> iholds = (List<IHold>) holds;

iholds.Add(UHold);
List holds=newlist();
列表iholds=(列表)保持;
添加(UHold);
显然,
UHold
实现了
IHold
接口,但也显然不能添加到
THold
对象的列表中。

那么,
列表不能以非泛型形式创建;我猜你在写文章的时候把尖括号弄丢了

无论如何,我猜你想从
列表
转到
列表
,或者反之亦然。无论哪种方式,最好的选择是Linq的OfType()方法:

List<THold> hold = new List<THold>();
//populate hold with items
List<IHold> test = hold.OfType<IHold>().ToList();
List hold=newlist();
//用项目填充暂挂
列表测试=hold.OfType().ToList();
Cast()
方法也应该可以工作,但是我发现每当我试图使用它来执行指定的任务时,它总是无法正常工作。使用Select()和投射每个项目也会起作用:

List<IHold> test = hold.Select(x=>(IHold)x).ToList();
List test=hold.Select(x=>(IHold)x.ToList();

本文介绍了协方差和逆变,这是您所描述的术语

@Fred-这有什么意思?@Fred:也许你是对的,但这不是注册建议的地方。把它贴在meta.stackoverflow.com上-那样的话,你可能会得到一些改变。IHold,UHold,我们都支持IHold!(对不起,我忍不住)
List<IHold> test = hold.Select(x=>(IHold)x).ToList();