无法使用as运算符或简单强制转换将列表转换或强制转换为另一个列表



让我们编写一个程序,对friendy讨厌的人进行排序。所有字符都是字符,并具有名称

我们可以将其表示为:

interface ICharacter
{
string GetName();
}
class Character : ICharacter
{
private readonly string name;
public Character(string name)
{
this.name = name;
}
public string GetName()
{
return this.name;
}
}

class Friendly : Character
{
public Friendly(string name) 
: base(name)
{
}
}
class Nasty : Character
{
public Nasty(string name)
: base(name)
{
}
}

现在,让我们以这种方式声明并将我们的字符存储到字典中:

Dictionary<Type, IList<ICharacter>> characters = new Dictionary<Type, IList<ICharacter>>();
characters.Add(typeof(Friendly), new List<ICharacter>() { new Friendly("friendly1"), new Friendly("friendly2") });
characters.Add(typeof(Nasty), new List<ICharacter>() { new Nasty("nasty1"), new Nasty("nasty2") });

现在,我们可以编码一种方法,将字典中的所有好友提取为友好好友列表,而不是字符列表:

public static List<Friendly> GetFriendlyPeople(Dictionary<Type, IList<ICharacter>> allPeople)
{
if (allPeople.TryGetValue(typeof(Friendly), out IList<ICharacter> friendly)) {
return friendly as List<Friendly>; //(List<Friendly>)friendly the same result
}
return new List<Friendly>();
}

最后,我们可以调用GetFriendlyPeople:方法

List<Friendly> friends = GetFriendlyPeople(characters);

但返回值为null。我尝试了几种使用接口或不使用接口的组合,结果都是一样的。

在字典中有两种类型,FriendlyNasty

Dictionary中的列表是ICharacter的列表——它不是一个类型——它的多个可类型,这就是为什么你得到null的原因。

试试这个,你会得到一个例外,它也会解释你。

return friendly.Cast<Friendly>().ToList()// here you will get now an exception.

如果你想拥有你的Friendly项目仍然是可能的。试试这个代码。

return friendly.Where(x=> x is Friendly).Cast<Friendly>().ToList(); // here you will get your items.

相关内容

  • 没有找到相关文章

最新更新