我什至不确定是否可以做我想做的事情......但是,我有一个字符列表(Character是基本类型),它包含从Character类型(如Warriors和Mages)派生的项目。
继承链是:
Character->Melee->Warrior
Character->Spellcaster->Mage
Run Code Online (Sandbox Code Playgroud)
我想在一行代码中提取所有法师和所有战士。
我设法做到了OfType,但无法使用.Where
我试过以下
List<Character> chars = new List<Character>()
{
new Warrior(),
new Warrior(),
new Warrior(),
new Mage(),
new Mage(),
new Mage(),
};
List<Melee> melees = chars.OfType<Melee>().ToList(); // works
List<Melee> melee = chars.Where(c => c is Melee).ToList(); // doesnt work
Run Code Online (Sandbox Code Playgroud)
这是错误
严重性代码说明项目文件行抑制状态错误 CS0029 无法将类型 System.Collections.Generic.List<MagicDestroyers.Characters.Character> 隐式转换为 System.Collections.Generic.List<MagicDestroyers.Characters.Melee.Melee>
显然我需要执行一些类型转换,我只是不知道在哪里做?
编辑:问题是如何通过使用.Where带有的行来获得相同的结果c => c is Melee,因为它很容易阅读。
这要求框架弄清楚一点:
List<Melee> melee = chars.Where(c => c is Melee).ToList(); // doesnt work
Run Code Online (Sandbox Code Playgroud)
即使您使用Where过滤掉只有 type 的项目,Melee您过滤的列表也是 type Character。所以无论你如何过滤列表Character,结果都是一个IEnumerable<Character>,或者List<Character>调用之后ToList()。
您不能将 a 分配给List<Character>声明为 的变量List<Melee>。
你可以做
List<Melee> melee = chars.Where(c => c is Melee).Cast<Melee>().ToList();
Run Code Online (Sandbox Code Playgroud)
但是您使用的前一行OfType更简单明了。OfType正在做同样的事情 - 选择给定类型的元素并将它们转换为该类型。
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |