这个项目的作用域只是一个控制台应用程序,当我试图传递值时,我遇到了一个非常恼人的错误:参数类型'lambda表达式‘不能分配给参数类型'DungeonRunner.Ability’
要传递参数的函数:
public void UseSpell(Ability ability)
{
var SpellToUse = this.CharClass.GetAbilities();
//Get all Abilites
this.CharClass.GetAbilities();
if (this.MP == 0)
{
Console.WriteLine("You cannot use advanced Abilities, drink a Mana Potion to restore Mana");
var UsedSpell = SpellToUse.First();
this.MP -= UsedSpell.ManaCost1; //This line is unnecessary because the first spell costs nothing
}
else if(this.MP >= 0)
{
var UsedSpell = SpellToUse.Find(abilityName => abilityName.SpellName1 == ability.SpellName1);
this.MP -= UsedSpell.ManaCost1;
}第一类指的是:
namespace DungeonRunner
{
public class Ability
{
private int ManaCost;
private int SpellDamage;
private string SpellName;
public Ability(int manaCost, int spellDamage, string spellName)
{
ManaCost = manaCost;
SpellDamage = spellDamage;
SpellName = spellName;
}
public int ManaCost1
{
get => ManaCost;
set => ManaCost = value;
}
public int SpellDamage1
{
get => SpellDamage;
set => SpellDamage = value;
}
public string SpellName1
{
get => SpellName;
set => SpellName = value;
}
}
}这是我试图传递的值:
`MyCharacter.UseSpell(ability => ability.SpellName == spellname)`;问题是:我怎样才能优化这个问题,这样错误就消失了。也许我需要改变参数。但我觉得这不需要。
发布于 2018-09-21 10:03:10
假设具有所有能力的列表称为“能力”,则可以编写以下代码;
Ability usedAbility = abilities.FirstOrDefault(x => x.SpellName1 == spellname);
if(usedAbility != null)
{
MyCharacter.UseSpell(usedAbility);
}使用FirstOrDefault,您将得到第一个具有拼写名的Ability。我添加了空检查,因为如果没有这个名称的Ability,您将从FirstOrDefault获得null。
发布于 2018-09-21 10:19:01
实际上有两种方法你可以做到。
第一种方法是向您的方法提供实际的Ability,并让它对该实例执行一些操作:
public void UseSpell(Ability ability)
{
// do something with the provided ability
}这样,你的客户必须寻找正确的能力。要做到这一点,它必须了解所有的能力:
UseSpell(myAbilities.FirstOrDefault(x => x.Spellname == "MySpell"));另一个机会是UseSpell基于某种条件搜索Ability本身,您可以通过委托提供这些条件。但是,这假设UseSpell拥有access的所有功能,以便搜索“正确”的能力:
public void UseSpell(Func<Ability, bool> predicate)
{
// get all abilities
var allAbilties = ...;
// get the one that matches the condition
var ability = allAbilities.FirstOrDefault(predicate)
}现在,客户端只提供了标准,而没有提供所有能力列表:
UseSpell(x => x.Spellname == "MySpell");因此,取决于您的所有能力列表的位置,这一种或另一种方法可能更好。结果在这两种情况下是相同的。然而,语义是不同的。
发布于 2018-09-21 10:25:11
推荐信是错误的。执行以下操作
MyCharacter.Where(ability => ability.SpellName == spellname).Foreach(ability => UseSpell(ability));https://stackoverflow.com/questions/52441145
复制相似问题