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();