C#Func委托与lambda表达式组合不正确
我有一个Employee类,带有一些基本参数,以及一个拥有员工对象列表的班级员工。 我想在类员工中使用func委托,以便能够在主类中使用以下lambda表达式。 我想我在这里有一些语法错误...我得到以下错误消息:“不能转换lambda表达式键入'员工',因为它不是委托类型”。
有人知道我做错了什么?
非常感谢你们!
static void Main(string[] args)
{
Employees lijst = new Employees();
lijst.Add(new Employee("B1", 200));
lijst.Add(new Employee("B2", 100));
lijst.Add(new Employee("B3", 300));
lijst.Wijzig((Employee b) => b.Salary += 100);
Console.ReadKey();
}
class Employee
{
public String Name { get; set; }
public int Salary { get; set; }
public Employee(String Name, int Salary)
{
this.Name = Name;
this.Salary = Salary;
}
}
class Employees
{
public Func<Employee, int> Wijzig = new Func<Employee, int>(Change);
private ArrayList _lijst = new ArrayList();
public void Add(Employee e)
{
_lijst.Add(e);
}
static int Change(Employee b)
{
return 0;
}
}
这是我的解决方案,在Main函数中没有改变:
static void Main(string[] args)
{
Employees lijst = new Employees();
lijst.Add(new Employee("B1", 200));
lijst.Add(new Employee("B2", 100));
lijst.Add(new Employee("B3", 300));
lijst.Wijzig((Employee b) => b.Salary += 100);
lijst.Print();
Console.ReadKey();
}
class Employee
{
public String Name { get; set; }
public int Salary { get; set; }
public Employee(String Name, int Salary)
{
this.Name = Name;
this.Salary = Salary;
}
}
class Employees
{
// [Delete]
// public Func<Employee, int> Wijzig = new Func<Employee, int>(Change);
private ArrayList _lijst = new ArrayList();
public void Add(Employee e)
{
_lijst.Add(e);
}
// [Delete]
//static int Change(Employee b)
//{
// return 0;
//}
// [New]
public void Wijzig(Func<Employee, int> func)
{
foreach (Employee e in _lijst)
{
func(e);
}
}
public void Print()
{
foreach (Employee e in _lijst)
{
Console.WriteLine(e.Name + "t" + e.Salary);
}
}
}
Wijzig
是类型为Func<Employee, int>
的委托。 即它是一种接受员工对象并返回一个整数的方法。 所以lijst.Wijzig
返回这个代表。 如果你想调用这个委托,你应该传递employee对象(根据签名Func<Employee, int>
),但是你传递的是lambda委托,而不是雇员。 正确的调用:
lijst.Wijzig(someEmployee); // calls Employees.Change
这将调用一个int Change(Employee b)
方法。 但似乎你不想调用Change
方法(除了返回零之外什么都不做)。 你想要引用一些真正的变化 - 薪水增量。 所以,你应该做的第一步是改变分配给Wijzig
的委托,然后用你的雇员对象调用这个委托:
lijst.Wijzig = (Employee b) => { b.Salary += 100; return 0; }
lijst.Wijzig(someEmployee); // calls lambda which we assigned
笔记:
ArrayList
没有意义,您应该使用泛型集合(如List<Employee>
。 Change
方法返回一个整数。 考虑让它失效。 您正在重新实现LINQ功能 - 有一个ForEach
扩展方法,它接受要在集合中的每个项目上执行的操作。
var list = new List<Employee> {
new Employee("B1", 200),
new Employee("B2", 100),
new Employee("B3", 300)
};
list.ForEach(e => e.Salary += 100);
而已。 所有你的代码没有自定义类。
你的下面的代码行来调用func
lijst.Wijzig((Employee b) => b.Salary += 100);
应该在下面传递一个Employee
对象
int result = lijst.Wijzig(lijst[0]);
链接地址: http://www.djcxy.com/p/31597.html
上一篇: C# Func delegate in combination with lambda expression not correct
下一篇: Can a C# lambda expression have more than one statement?