该项目的范围只是一个控制台应用程序,我很烦 尝试传递值时遇到的错误: 参数类型“ 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)`;
问题是:我如何才能对此进行优化,以使错误消失。 可能是我需要更改参数。但我认为这不是必需的。
答案 0 :(得分:2)
假定具有所有能力的列表称为能力,您可以编写以下代码;
Ability usedAbility = abilities.FirstOrDefault(x => x.SpellName1 == spellname);
if(usedAbility != null)
{
MyCharacter.UseSpell(usedAbility);
}
使用FirstOrDefault
,您将获得第一个带有拼写名称的Ability
。我添加了空检查,因为如果没有Ability
的名称,您将从null
中获得FirstOrDefault
。
答案 1 :(得分:0)
实际上有两种方法可以实现。
第一个方法是为您的方法提供实际的Ability
,并让它对该实例执行某些操作:
public void UseSpell(Ability ability)
{
// do something with the provided ability
}
这样,您的客户就必须搜索正确的能力。为此,它必须了解所有能力:
UseSpell(myAbilities.FirstOrDefault(x => x.Spellname == "MySpell"));
另一个机会是UseSpell
会根据某种条件自行搜索Ability
,您可以由委托人提供。但是,假设UseSpell
具有对所有功能的访问权限,以便搜索“正确的”一项:
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");
因此,根据所有能力列表的位置,一种或另一种方法可能会更好。在两种情况下结果都是相同的。但是语义是不同的。
答案 2 :(得分:0)
引用是错误的。执行以下操作
MyCharacter.Where(ability => ability.SpellName == spellname).Foreach(ability => UseSpell(ability));