C# Func 委托结合 lambda 表达式不正确
C# Func delegate in combination with lambda expression not correct
我有一个 class 员工,有一些基本参数,还有一个 class 员工,有一个员工对象列表。我想在 class 员工中使用 func 委托,以便能够在主 class 中使用以下 lambda 表达式。我想我这里有一些语法错误...我收到以下错误消息:"cannot convert lambda expression to type 'Employee' because it is not a delegate type".
有人知道我做错了什么吗?
非常感谢你们!!
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;
}
}
Wijzig
是 Func<Employee, int>
类型的委托。 IE。这是一种接受员工对象和 returns 整数的方法。所以 lijst.Wijzig
returns 这个代表。如果你想调用这个委托,你应该传递员工对象(根据签名 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
备注:
- 在 .NET 2.0+ 中使用
ArrayList
没有任何意义,您应该改用 List<Employee>
之类的通用集合。
- 不清楚为什么您的
Change
方法 returns 是一个整数。考虑使其无效。
您正在重新实现 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]);
这是我的解决方案,主要功能没有变化:
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);
}
}
}
我有一个 class 员工,有一些基本参数,还有一个 class 员工,有一个员工对象列表。我想在 class 员工中使用 func 委托,以便能够在主 class 中使用以下 lambda 表达式。我想我这里有一些语法错误...我收到以下错误消息:"cannot convert lambda expression to type 'Employee' because it is not a delegate type".
有人知道我做错了什么吗?
非常感谢你们!!
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;
}
}
Wijzig
是 Func<Employee, int>
类型的委托。 IE。这是一种接受员工对象和 returns 整数的方法。所以 lijst.Wijzig
returns 这个代表。如果你想调用这个委托,你应该传递员工对象(根据签名 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
备注:
- 在 .NET 2.0+ 中使用
ArrayList
没有任何意义,您应该改用List<Employee>
之类的通用集合。 - 不清楚为什么您的
Change
方法 returns 是一个整数。考虑使其无效。 您正在重新实现 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]);
这是我的解决方案,主要功能没有变化:
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);
}
}
}